You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 22:43:23