【 使用环境 】生产环境
【 OB or 其他组件 】OceanBase企业版
【 使用版本 】5.7.25-OceanBase-v4.2.1.7
【问题描述】使用insert ignore into select 语法向目的表中插入数据,即便没有数据插入到目的表,目的表自增字段的步长也会与源表数据量指数级进行改变
【复现路径】
-
建表
CREATE TABLEtest_insert_ignore
(
ID
int(10) unsigned NOT NULL AUTO_INCREMENT,
param1
varchar(255) DEFAULT NULL,
PRIMARY KEY (ID
),
UNIQUE KEYidx_p1
(param1
)
) AUTO_INCREMENT = 1 AUTO_INCREMENT_MODE = ‘ORDER’ DEFAULT CHARSET = utf8mb4 COMMENT = ‘test_insert_ingore’; -
向表中插入n条数据,n的值可参考第6步
-
执行如下sql
insert ignore into test_insert_ignore (param1)
select param1 from test_insert_ignore; -
从DBEaver中查看自增字段ID的下一个自增值,如下图
-
反复执行步骤3和4
-
会发现如下现象:
(1) 如果表test_insert_ignore中数据量n<32,每次执行完3、4两步,观察到的自增值会比前一次增加31;
(2) 如果n<64,当前自增值会比前一次增加63;
(3) 猜测规律,增量是"大于n的第一个2的指数-1",比如31、63、1023 -
反复执行步骤3,会导致自增id很快达到上限