1. 程式人生 > >往mysql中插入 自增id不連續(曾經的坑)

往mysql中插入 自增id不連續(曾經的坑)

merphix(CSDN UID:u014567183) 給博主提供了莫大的幫助

問題描述

事情是這樣的,博主用 Mybatis 往 mysql 做批量插入,結果發現特定的 SQL 語句導致 自增int型主鍵不連續,多方求證便有了這篇博文。

還原問題

建表語句

CREATE TABLE versionfileinfo (
  id INT NOT NULL PRIMARY KEY auto_increment,
  vid INT NOT NULL COMMENT '版本資訊id' ,
  buildNo INT NOT NULL COMMENT '版本號' ,
  displayVersion VARCHAR
(50) NOT NULL COMMENT '顯示版本' , fileKey VARCHAR (100) NOT NULL COMMENT '檔案標識' , fileSize BIGINT NOT NULL COMMENT '檔案大小' , fileUrl VARCHAR (1000) NOT NULL COMMENT '檔案存放url' , description VARCHAR (500) COMMENT '描述' , checkType VARCHAR (50) COMMENT '校驗方式' , checkCode VARCHAR (500) COMMENT '校驗碼' , createTime BIGINT NOT
NULL COMMENT '秒級時間戳' , lastUpdateTime BIGINT NOT NULL COMMENT '秒級時間戳' , isActive bit NOT NULL COMMENT '刪除標識' , ts BIGINT NOT NULL COMMENT '毫秒級時間戳' ) ENGINE = INNODB DEFAULT CHARSET utf8;

批量插入方案一

INSERT INTO `versionfileinfo` (
    vid,
    buildNo,
    displayVersion,
    fileKey,
    fileSize,
    fileUrl,
    description,
    checkType,
    checkCode,
    createTime,
    lastUpdateTime,
    isActive,
    ts
)(
    SELECT
1, 2, '顯示版本', NULL, NULL, 'www.asdasd.com', '描述', "a", "b", 123, 123123, 1, 123123 ) UNION ( SELECT 1, 2, '顯示版本2', NULL, NULL, 'www.asdasd.com', '描述', "a", "b", 123, 123123, 1, 123123 )

批量插入方案二

INSERT INTO `versionfileinfo` (
    vid,
    buildNo,
    displayVersion,
    fileKey,
    fileSize,
    fileUrl,
    description,
    checkType,
    checkCode,
    createTime,
    lastUpdateTime,
    isActive,
    ts
)
VALUES
    (
        1,
        1,
        '顯示版本',
        NULL,
        NULL,
        'www.asdasd.com',
        '描述',
        "a",
        "b",
        123,
        123123,
        1,
        123123
    ),
(
        1,
        2,
        '顯示版本',
        NULL,
        NULL,
        'www.asdasd.com',
        '描述',
        "a",
        "b",
        123,
        123123,
        1,
        123123
    )

結果發現方案一會導致自增id不連續,二方案二id是連續的
舉例:id為自增主鍵
先清空資料表
上面提供的批量插入sql語句一次插入2條記錄
第一次執行 第一條id =1 ,第二條id=2
第二次執行 第三條id =4 ,第四條id=5
第三次執行 第五條id =7 ,第六條id=8

問題實質

和 MySQL 的 innodb 資料庫引擎相關,據說是 MyISAM 引擎 不會有這種問題

解決方案

  1. 換掉 innodb 資料庫引擎
  2. 用上提到的方案二SQL
  3. 配置 innodb_autoinc_lock_mode 引數