往mysql中插入 自增id不连续(曾经的坑)
来源:互联网 发布:中国省份数据库 编辑:程序博客网 时间:2024/06/09 14:01
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 自增列 锁机制简述
解决方案
- 换掉 innodb 数据库引擎
- 用上提到的方案二SQL
- 配置 innodb_autoinc_lock_mode 参数
MySQL 官方 innodb_autoinc_lock_mode 文档
innodb_autoinc_lock_mode 类型简述
innodb_autoinc_lock_mode 配置方法
0 0
- 往mysql中插入 自增id不连续(曾经的坑)
- 往mysql中插入 自增id不连续(曾经的坑)
- MySQL 中 AUTO_INCREMENT 的“坑”--id不连续
- MySQL中如何获取下一条插入的自增ID 或 刚刚插入的id
- 得到mysql插入的自增id
- MyBatis插入记录获取自增的ID(MySQL)
- innodb_autoinc_lock_mode 下自增id不连续的原因
- 解决自增id不连续的问题
- Mysql实现数据的不重复写入(insert if not exists)以及新问题:ID自增不连续的解答
- Mysql实现数据的不重复写入(insert if not exists)以及新问题:ID自增不连续的解答
- Mysql实现数据的不重复写入(insert if not exists)以及新问题:ID自增不连续的解答
- Mysql实现数据的不重复写入(insert if not exists)以及新问题:ID自增不连续的解答
- MySQL中自增主键不连续之解决方案。
- mysql插入数据,获取最新插入的ID(自增列)
- mysql插入数据,获取最新插入的ID(自增列)
- Mysql中获取刚插入的自增id的三种方法
- Mysql中获取新插入的自增id的三种方法
- mysql数据库删除数据后,数据自增id断点不连续
- 这是一份很有诚意的 Protocol Buffer 语法详解
- dp计算
- 山东省第七届ACM省赛 Triple Nim
- 删除数据
- Android 根据文件Uri找文件路径 和根据路径找文件Uri
- 往mysql中插入 自增id不连续(曾经的坑)
- Kth Smallest Element in a BST
- DSP2808与ARM STM32F103的SPI通讯例程及详解
- PowerDesigner16.5快速入门显示,注释comment配置方法,以及创建sql文件过程中需要注意的一些问题
- Unknown module(s) in QT: multimedia
- CCF NOI1015 星期几
- 几种决策树学习算法比较
- Leetcode 290. Word Pattern
- oracle存储过程中的while loop循环示例