什么可能导致自动增量主键字段(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) 前端自动增量问题

修复自动增量mysql [重复]

mysql LOAD DATA INFILE 与自动增量主键

如果自动增量字段不是第一个,jOOQ 可以支持复合主键吗

如何更改主键自动增量,以便在删除行时不会跳过值[重复]