insert ignore into select语法,目的表的自增列的步长有问题

【 使用环境 】生产环境
【 OB or 其他组件 】OceanBase企业版
【 使用版本 】5.7.25-OceanBase-v4.2.1.7
【问题描述】使用insert ignore into select 语法向目的表中插入数据,即便没有数据插入到目的表,目的表自增字段的步长也会与源表数据量指数级进行改变
【复现路径】

  1. 建表
    CREATE TABLE test_insert_ignore (
    ID int(10) unsigned NOT NULL AUTO_INCREMENT,
    param1 varchar(255) DEFAULT NULL,
    PRIMARY KEY (ID),
    UNIQUE KEY idx_p1 (param1)
    ) AUTO_INCREMENT = 1 AUTO_INCREMENT_MODE = ‘ORDER’ DEFAULT CHARSET = utf8mb4 COMMENT = ‘test_insert_ingore’;

  2. 向表中插入n条数据,n的值可参考第6步

  3. 执行如下sql
    insert ignore into test_insert_ignore (param1)
    select param1 from test_insert_ignore;

  4. 从DBEaver中查看自增字段ID的下一个自增值,如下图

  5. 反复执行步骤3和4

  6. 会发现如下现象:
    (1) 如果表test_insert_ignore中数据量n<32,每次执行完3、4两步,观察到的自增值会比前一次增加31;
    (2) 如果n<64,当前自增值会比前一次增加63;
    (3) 猜测规律,增量是"大于n的第一个2的指数-1",比如31、63、1023

  7. 反复执行步骤3,会导致自增id很快达到上限

你好,你提的这个技术问题牵涉到OceanBase企业版范围内的功能细节;针对此类问题,建议你通过以下方式寻求帮助:

  1. 如你所在的企业客户已签署OceanBase企业版销售合同,请你联系客户经理;

  2. 如你所在的企业客户尚未签署OceanBase企业版销售合同,你可通过OceanBase官网商务咨询页面留下你的联系方式,OceanBase企业版的业务顾问会在一个工作日内与你联系。

另外,我们欢迎你使用社区版,并在论坛/社群中分享你对社区版本的想法、经验和问题,与其他社区成员共同交流。