2020-11-24 11:06:53
围观(6756)
在进行一些数据采集爬取的时候难免会出现重复的数据,数据入库到 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
版权声明 : 未经允许禁止转载!
上一篇文章: 记-广西贵州自驾游
下一篇文章: 开发了一个恐怖悬疑小说推荐网站