键 'PRIMARY' 的重复条目 - 即使它设置为 AUTO_INCREMENT

Duplicate entry for key 'PRIMARY' - even though it is set to AUTO_INCREMENT

有点奇怪 - 我已经大约 8 年没有更改该站点的配置、数据库和 PHP 代码了。我为其制作的那个人一直在添加、删除、更改库存,没有任何问题,今天突然出现此错误:

Duplicate entry '2541' for key 'PRIMARY'

正在执行(为文本插入通用值):

INSERT INTO stock (id,title,category,description,price,last_update,sold) VALUES(NULL,'Item name','72','Item description','0',1613723525,'no')

四处搜索似乎表明这是主键未设置为自动递增时的常见问题 - 有道理。但是通过phpMyAdmin查了一下,确实是。

索引中是否有设置为主而不是唯一的?

数据库中还有 5 个其他 table,但 none 已链接(如通过 SQL 的硬链接,PHP 处理所有交叉table东西)。

我检查了一下,库存中确实有一件商品 table,ID 为 2541。那么,为什么 NULL AUTO_INCREMENT 值转换为现有 ID?

编辑

我注意到我最近创建的 table(可能通过 MySQL Workbench)具有不同的索引设置,添加了 id_UNIQUE index - 我是否需要在导致问题的股票 table 中使用其中之一?

根据您的描述和您的评论“有趣的是,每次我刷新 ID 时,它都会尝试插入(并失败)增量 1”,我怀疑自动增量的种子不知何故 table 更改为之前某个时间插入的某个值。

我不知道这到底是怎么发生的。

现在,每次您尝试插入记录时,此内部计数器都会增加,因此您会在错误消息中看到数字增加(2541、2542,...)当您尝试插入一行时,内部计数器无论事务是否提交到数据库,都会递增。在您的情况下,插入操作被回滚,因为生成的值违反了唯一约束并且内部计数器不断增长。


要更改种子,您可以运行以下语句:

ALTER TABLE stock AUTO_INCREMENT=1234567;

您需要将其设置为 table 中存在的当前最大值,以便系统尝试插入的新条目不会发生冲突。

另见 How to set initial value and auto increment in MySQL?

This answer 展示了如何在 MySQL Workbench 和 PhpMyAdmin 中更改自动增量种子。也许有人不小心做了这件事而没有注意到。