键 '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 中更改自动增量种子。也许有人不小心做了这件事而没有注意到。
有点奇怪 - 我已经大约 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 中更改自动增量种子。也许有人不小心做了这件事而没有注意到。