什么可能导致自动增量主键字段(mysql)上的重复ID?

时间:2009-02-05 00:32:35

标签: mysql insert lastinsertid

分辨

来自开发人员:问题是以前版本的代码仍在写入使用手动ID而不是自动增量的表。自我注意:始终检查写入表的其他可能位置。

我们在表格中获得了重复的密钥。它们不是同时插入的(相隔6小时)。

表格结构:

CREATE TABLE `table_1` (
  `sales_id` int(10) unsigned NOT NULL auto_increment,
  `sales_revisions_id` int(10) unsigned NOT NULL default '0',
  `sales_name` varchar(50) default NULL,
  `recycle_id` int(10) unsigned default NULL,
  PRIMARY KEY  (`sales_id`),
  KEY `sales_revisions_id` (`sales_revisions_id`),
  KEY `sales_id` (`sales_id`),
  KEY `recycle_id` (`recycle_id`)
) ENGINE= MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=26759 ;

插入:

insert into `table_1` ( `sales_name` ) VALUES ( "Blah Blah" )

我们使用PHP5运行MySQL 5.0.20并使用mysql_insert_id()在插入查询后立即检索插入ID。

6 个答案:

答案 0 :(得分:5)

我过去在MySql数据库中突然出现了一些重复的密钥错误,即使定义了主键和auto_increment。每次都是因为桌子已经损坏了。

如果执行损坏,检查表应该暴露问题。您可以通过运行:

来完成此操作
CHECK TABLE tbl_name

如果它反过来又变得腐败(通常会说尺寸比实际应该大),那么只需运行以下内容进行修复:

REPAIR TABLE tbl_name

答案 1 :(得分:2)

sales_id字段是否有主要(或唯一)密钥?如果没有,那么其他东西可能正在进行重新使用现有数字的插入或更新。而对于“别的东西”,我不只是指代码;它可能是一个无法访问数据库的人。

答案 2 :(得分:2)

正如对方说的那样;用你的例子来说,这是不可能的。

这与您的问题无关,但您不必为主键列创建单独的KEY - 当您已经拥有唯一(主要)键时,它只是向表中添加一个额外的非唯一索引。

答案 3 :(得分:2)

  

我们在表格中获得了重复的密钥。

您的意思是在尝试插入时遇到错误,或者您是否意味着您在列中存储了多个值?

当您从INSERT中省略该列或尝试插入NULL或零时,仅自动增加。否则,您可以在INSERT语句中指定一个值,从而覆盖自动增量机制。例如:

INSERT INTO table_1 (sales_id) VALUES (26759);

如果您指定的值已存在于表中,则会出现错误。

答案 4 :(得分:1)

请发布此查询的结果:

SELECT `sales_id`, COUNT(*) AS `num`
FROM `table_1`
GROUP BY `sales_id`
HAVING `num` > 1
ORDER BY `num` DESC

答案 5 :(得分:0)

  • 如果您在其他字段上有唯一键,则可能是问题所在。

  • 如果你的auto_increment列达到了最高值,MySQL将继续尝试重新插入它。例如,如果sales_id是tinyint列,则在达到id 127后会出现重复的键错误。