mysql-防止唯一的id增量

时间:2011-08-16 12:49:19

标签: mysql

我有一张具有独特约束的表,工作正常 但问题是当尝试插入重复记录时由于唯一约束而失败但是,增加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

2 个答案:

答案 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约束而失败,然后在必要时应用上述查询。