MySQL除工具表外,如何实现全局无限递增序列?
MySQL 8.0 跨表全局递增序列的无工具表实现方案
你目前通过创建ubersequence工具表,结合REPLACE操作生成跨表的全局递增序列,针对你使用的MySQL 8.0.39版本,确实存在无需依赖额外工具表的原生可靠方案,以下是具体实现:
1. 使用原生序列对象(SEQUENCE)
MySQL 8.0正式引入了序列对象,这是数据库级的全局序列,天然支持跨表使用,无需维护冗余表结构。
创建序列
执行以下SQL创建一个全局序列,可根据业务需求调整参数:
CREATE SEQUENCE global_seq START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 9223372036854775807 -- BIGINT最大值,远高于INT的20亿上限 CACHE 10; -- 可选,缓存序列值提升高并发场景性能,可按需调整
获取下一个序列值
每次需要全局递增ID时,直接执行:
SELECT NEXT VALUE FOR global_seq;
该操作是原子性的,无需手动包裹事务,数据库会自动保证序列值的唯一性和递增性。
查看当前序列值
若需查看序列的最后生成值,可执行:
SELECT CURRENT VALUE FOR global_seq;
优势对比
- 无需维护工具表,减少冗余结构
- 原生支持原子操作,无需手动处理事务逻辑
- 可通过
MAXVALUE设置超大上限(BIGINT支持近9e18次操作) - 支持缓存配置,高并发场景下性能更优
2. 不推荐的替代方案(全局变量+存储过程)
虽然可以通过自定义全局变量和存储过程实现,但存在MySQL重启后变量值丢失的问题,且需要额外处理原子性,可靠性远不如原生序列,仅作参考:
-- 初始化全局变量 SET GLOBAL global_seq = 1; -- 创建存储过程获取序列值 DELIMITER // CREATE PROCEDURE get_next_seq(OUT seq_val BIGINT) BEGIN SET GLOBAL global_seq = global_seq + 1; SELECT global_seq INTO seq_val; END // DELIMITER ; -- 调用存储过程获取值 CALL get_next_seq(@val); SELECT @val;
注意:此方法需要super权限,且MySQL重启后序列值会重置,不适合生产环境。
内容的提问来源于stack exchange,提问作者Fattie
相关产品推荐
相关产品推荐

