往mysql中插入 自增id不連續(曾經的坑)
阿新 • • 發佈:2019-02-18
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 引擎 不會有這種問題
解決方案
- 換掉 innodb 資料庫引擎
- 用上提到的方案二SQL
- 配置 innodb_autoinc_lock_mode 引數