什么可能导致自动增量主键字段(mysql)上的重复 ID?
Posted
技术标签:
【中文标题】什么可能导致自动增量主键字段(mysql)上的重复 ID?【英文标题】:What could cause duplicate ids on a auto increment primary key field (mysql)? 【发布时间】:2009-02-05 00:32:35 【问题描述】:已解决
来自开发人员:问题是之前版本的代码仍在写入使用手动 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。
【问题讨论】:
请提供 SHOW CREATE TABLE 的输出,会有帮助。 【参考方案1】:过去我在MySql数据库中突然出现了一些重复键错误,即使定义了主键和auto_increment。每次都是因为表损坏了。
如果执行检查表损坏,应该会暴露问题。你可以通过运行来做到这一点:
CHECK TABLE tbl_name
如果它以损坏的形式返回(通常会说大小比实际应该的大),那么只需运行以下命令来修复它:
REPAIR TABLE tbl_name
【讨论】:
【参考方案2】:sales_id 字段是否有主键(或唯一键)?如果不是,那么其他东西可能正在重新使用现有数字进行插入或更新。我所说的“其他东西”不仅仅是指代码。可能是人无意中访问了数据库。
【讨论】:
抱歉,是的,sales_id 确实有一个主键。忘了提那个。不错的收获虽然 +1【参考方案3】:正如对方所说;用你的例子是不可能的。
这与您的问题无关,但您不必为主键列创建单独的 KEY - 当您已经拥有唯一(主)键时,它只是在表中添加一个额外的非唯一索引。
【讨论】:
感谢您的注意。我会向开发人员提及这一点。【参考方案4】:我们在一个表中得到了重复的键。
您的意思是您在尝试插入时遇到错误,还是您的某些值多次存储在列中?
仅当您从 INSERT 中省略列或尝试插入 NULL 或零时,才会启动自动增量。否则,您可以在 INSERT 语句中指定一个值,覆盖自动增量机制。例如:
INSERT INTO table_1 (sales_id) VALUES (26759);
如果你指定的值已经存在于表中,你会得到一个错误。
【讨论】:
【参考方案5】:请发布此查询的结果:
SELECT `sales_id`, COUNT(*) AS `num`
FROM `table_1`
GROUP BY `sales_id`
HAVING `num` > 1
ORDER BY `num` DESC
【讨论】:
【参考方案6】:如果您在其他字段上有唯一键,则可能是问题所在。
如果您的 auto_increment 列的值已达到最大值,MySQL 将继续尝试重新插入它。例如,如果 sales_id 是 tinyint 列,则在达到 id 127 后会出现重复键错误。
【讨论】:
完全不正确,如果发生这种情况,mysql会产生错误以上是关于什么可能导致自动增量主键字段(mysql)上的重复 ID?的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 后端和访问 (.accdb, 2013) 前端自动增量问题