mysql 这两种批量插入的区别是什么?尤其第一种导致了自增主键自增不连续,有什么决绝办法吗?

SolidCocoi 2017-04-18 11:42:34
第一种方式: 使用 union
但是会导致 插入 n条数据 主键自增n+1
举例:id为自增主键
先清空数据表
下面的语句一次插入2条。
第一次运行 第一条id =1 ,第二条id=2
第二次运行 第三条id =4 ,第四条id=5
第三次运行 第五条id =7 ,第六条id=8



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
)


第二种方式:不使用union


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
)



建表语句:
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;



求大大指点,主键额外增加是怎么回事呢?
...全文
198 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
SolidCocoi 2017-04-19
  • 打赏
  • 举报
回复
@merphix 谢谢啦。查了很多资料才看懂的,昨天没看懂都 没敢吱声 233。
u014567183 2017-04-18
  • 打赏
  • 举报
回复
你这两个sql语句一样啊。而且根据你给的数据,测试没问题。主键递增。
u014567183 2017-04-18
  • 打赏
  • 举报
回复
再给你一种解决方案 innodb_autoinc_lock_mode innodb_autoinc_lock_mode当innodb_autoinc_lock_mode = 0时正常。
u014567183 2017-04-18
  • 打赏
  • 举报
回复
看了下资料,具体的原理我也不太明白。大概给你个思路。 这是innodb的问题,使用MyISAM就不会这样。 其实主要就是这两个在处理AUTO_INCREMENT列时处理的方式不同。 详情请百度或Google
AUTO_INCREMENT列在InnoDB里如何工作
推荐个文章 http://blog.sina.com.cn/s/blog_502c8cc40100kift.html 可以拿来做参考。 再给个解决方案 : 每次执行完sql , flush privileges;
SolidCocoi 2017-04-18
  • 打赏
  • 举报
回复
引用 1 楼 u014567183 的回复:
你这两个sql语句一样啊。而且根据你给的数据,测试没问题。主键递增。
我的锅 黏贴错了 第一种:
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
	)

57,062

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧