MariaDB序列自增异常排查:为何T2_ID步长变为2?
MariaDB序列自增ID翻倍问题排查
问题场景
我编写了如下MariaDB代码,旨在演示:
- 使用序列构建自增ID的表;
- 通过临时表关联的方式插入数据并实现ID自增。
操作步骤:
- 创建序列S1与表T1,T1_ID通过S1实现自增;
- 创建序列S2与表T2,T2_ID通过S2实现自增;
- 向T1插入数据,一切正常;
- 创建临时表TEMP_T2并插入数据,其中T1_NAME关联T1的SHORT_NAME字段;
- 通过关联查询将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
相关产品推荐
相关产品推荐

