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

MariaDB序列自增异常排查:为何T2_ID步长变为2?

MariaDB序列自增ID翻倍问题排查

问题场景

我编写了如下MariaDB代码,旨在演示:

  • 使用序列构建自增ID的表;
  • 通过临时表关联的方式插入数据并实现ID自增。

操作步骤:

  1. 创建序列S1与表T1,T1_ID通过S1实现自增;
  2. 创建序列S2与表T2,T2_ID通过S2实现自增;
  3. 向T1插入数据,一切正常;
  4. 创建临时表TEMP_T2并插入数据,其中T1_NAME关联T1的SHORT_NAME字段;
  5. 通过关联查询将TEMP_T2与T1的数据插入T2,预期S2自动生成T2_ID。

但最终T2的数据如下:

T2_ID|T1_ID|NAME|
-----+-----+----+
    2|    1|y   |
    4|    2|x   |
    6|    2|z   |

请问为何T2_ID出现了翻倍自增的情况?

原因与解决办法

T2_ID翻倍自增的核心原因是:MariaDB在执行INSERT ... SELECT关联插入时,序列的NEXT VALUE会被触发两次。

当你把NEXT VALUE FOR S2设为T2_ID的默认值时,MariaDB会先执行SELECT关联查询来预评估结果集,这个过程中每条匹配的数据都会触发一次序列取值;等到实际执行插入操作时,又会再次触发序列取值。两次触发导致每条插入的数据消耗了两个序列值,最终表现为T2_ID翻倍增长。

修复方案

不要依赖列的默认值调用序列,而是在INSERT语句的SELECT部分显式调用序列,确保每条数据只触发一次序列取值:

INSERT INTO T2 (T2_ID, T1_ID, NAME)
SELECT NEXT VALUE FOR S2, t1.T1_ID, temp.NAME
FROM TEMP_T2 temp
JOIN T1 t1 ON temp.T1_NAME = t1.SHORT_NAME;

如果场景允许,也可以改用MariaDB原生的AUTO_INCREMENT来实现自增ID,它在INSERT ... SELECT场景下不会出现这种重复触发的问题。

内容的提问来源于stack exchange,提问作者Menachem Sklarz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 05:05:31