我有一张具有独特约束的表,工作正常 但问题是当尝试插入重复记录时由于唯一约束而失败但是,增加id和下一个有效记录获得具有双增量的id。 如果插入失败,如何防止id递增?
更新
这是表结构
CREATE TABLE `crawl_links` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`url` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`priority` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`last_crawled_date` date DEFAULT NULL,
`crawl_status` varchar(255) COLLATE utf8_unicode_ci DEFAULT 'New',
`server_id` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
`site_name_id` int(11) DEFAULT NULL,
`last_fetched_by` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `unique_url` (`url`)
) ENGINE=InnoDB AUTO_INCREMENT=149 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
注意:我从创建的转储文件中取得了这个
我有一个链接数据库。我从爬虫收集链接并将其存储在数据库中。收集的链接可以是重复的。所以为了防止,我在url字段上添加了UNIQ约束。约束成功阻止插入重复记录。但是,即使插入失败,它也会增加id。我的id列是INT(11),我的数据库的当前快照显示max(id) = 128961841
但是记录数count(*) crawl_links = 700231
。
答案 0 :(得分:2)
首先 - 我同意SergeS,一般来说,如果ids之间存在差距,那就完全不重要了。 但我仍然很好奇,因为我从来没有这样的行为,所以我试图重现:
mysql> CREATE TABLE foo (
id TINYINT UNSIGNED NOT NULL auto_increment,
bar CHAR(2) NOT NULL,
PRIMARY KEY( id ),
UNIQUE( bar ) ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO foo SET bar = 'a';
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO foo SET bar = 'a';
ERROR 1062 (23000): Duplicate entry 'a' for key 2
mysql> INSERT INTO foo SET bar = 'b';
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM foo;
+----+-----+
| id | bar |
+----+-----+
| 1 | a |
| 2 | b |
+----+-----+
2 rows in set (0.00 sec)
我尝试过InnoDB和MyISAM,但无法以这种方式建立差距。你能描述一下你的桌面设置和插页吗?
答案 1 :(得分:-2)
有一个命令可以手动设置下一个要使用的ID:
ALTER TABLE tbl AUTO_INCREMENT = 100;
您可能必须检查最后一次INSERT是否因违反UNIQUE约束而失败,然后在必要时应用上述查询。