2009-02-05 27 views
0

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

从开发人员:问题是,代码的先前版本仍然写信给其使用手册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") 

我们正在运行MySQL 5.0.20与PHP5,并使用mysql_insert_id()来插入查询后立即取回插入ID。

+0

请提供SHOW CREATE TABLE的输出,这将有所帮助。 – 2009-02-05 01:51:19

回答

5

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

如果是腐败执行检查表应该暴露问题。您可以通过运行做到这一点:

CHECK TABLE tbl_name 

如果在回来的腐败反正(通常说的大小大于它实际上应该是),然后只需运行下面来修复它:

REPAIR TABLE tbl_name 
2

sales_id字段是否有主键(或唯一键)?如果没有,那么其他的东西可能会插入或更新,重新使用现有的数字。而通过“别的东西”,我不只是指代码;它可能是一个无意中访问数据库的人。

+0

对不起,是的,sales_id确实有一个主键。忘了提到这一点。好的,虽然+1 – 2009-02-05 00:44:45

0
  • 如果你在其他领域有一个唯一的关键,这可能是问题。

  • 如果您已达到auto_increment列的最高值,MySQL将继续尝试重新插入它。例如,如果sales_id是TINYINT列,你会怎么达到127 ID

+0

nope和noope :( – 2009-02-05 02:04:24

+0

并非如此,如果发生这种情况,mysql会生成错误 – Zbynek 2016-11-04 15:25:53

2

至于对方说以后得到重复键错误;用你的例子是不可能的。

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

2

我们正在获取表中的重复键。

你的意思是你在尝试插入时出现错误,或者你的意思是你有一些值存储在列中不止一次?

只有在您从INSERT中省略列时尝试插入NULL或零时,才会自动递增。否则,您可以在INSERT语句中指定一个值,以覆盖自动递增机制。例如:

INSERT INTO table_1 (sales_id) VALUES (26759); 

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

1

请发布此查询结果:

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