不败君

前端萌新&初级后端攻城狮

MySQL使用Ignore导致自增ID不连续

MySQL使用Ignore导致自增ID不连续

2020-11-24 11:06:53

围观(1037)

在进行一些数据采集爬取的时候难免会出现重复的数据,数据入库到 MySQL 可以使用 Ignore 进行去重插入。

例如博主之前写的这篇文章:Laravel 批量插入数据并去重


但是今天发现了个新问题,博主在开发一个小说推荐站,采集了很多小说信息,使用 Ignore 去重是会导致自增 ID 不连续的。


为了测试是否 Ignore 导致的,创建了一个这样的表:

CREATE TABLE `test` (
	`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
	`name` VARCHAR(50) NOT NULL DEFAULT '' COLLATE 'utf8_unicode_ci',
	PRIMARY KEY (`id`) USING BTREE,
	UNIQUE INDEX `name` (`name`) USING BTREE
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB
AUTO_INCREMENT=1
;

并且在表里面存入了三条数据:

+----+------+
| id | name |
+----+------+
| 1  | 111  |
| 2  | 222  |
| 3  | 333  |
+----+------+

此时使用 Ignore 插入重复数据:

INSERT IGNORE INTO test(name) VALUES(333),(444),(555)

数据还是正常的:

+----+------+
| id | name |
+----+------+
| 1  | 111  |
| 2  | 222  |
| 3  | 333  |
| 4  | 444  |
| 5  | 555  |
+----+------+

但是继续再插入一条数据时,会出现自增的 ID 不连续了:

INSERT INTO test(name) VALUES(666)

结果是:

+----+------+
| id | name |
+----+------+
| 1  | 111  |
| 2  | 222  |
| 3  | 333  |
| 4  | 444  |
| 5  | 555  |
| 7  | 777  |
+----+------+

另外除了 Ignore 会导致自增 ID 不连续外,还有很多情况都会导致自增 ID 不连续,例如 事务回滚 、 唯一索引的字段插入了重复的数据导致了报错。


其实使用 Ignore 会导致自增 ID 不连续最关键的问题是使用的引擎,在 MyISAM 引擎就不会出现这种使用 Ignore 自增 ID 不连续的问题。

为了使用事务不能使用 MyISAM 引擎,如果坚持要解决自增 ID 可以将 InnoDB 的配置修改 innodb_autoinc_lock_mode = 0 但是会影响性能,以及执行 insert 插入数据都是使用表锁...

不过 INT 类型也能存到 21 亿多数据,如果还不满足需求可以将自增 ID 的类型改成 BIGINT ,所以就算 ID 不连续问题也不大,大不了后面还能分表...

具体还有没有其他解决方法可以在 Google 搜索:mysql ignore auto_increment 博主学不动了...

本文地址 : bubaijun.com/page.php?id=224

版权声明 : 未经允许禁止转载!

评论:我要评论
发布评论:
Copyright © 不败君 粤ICP备18102917号-1

不败君

首 页 作 品 微 语