【发布时间】:2020-01-13 14:23:19
【问题描述】:
我有一个这样的表:
CREATE TABLE `things` (
`thing_id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(32) NOT NULL DEFAULT '',
PRIMARY KEY (`thing_id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4;
还有一些示例数据:
INSERT INTO things VALUES (NULL, 'thing 1'), (NULL, 'thing 2');
在我的应用程序中,有时我想将一行的主键提高到表中的最高值。例如,我希望将thing 1 的thing_id 更改为3(表的当前自动增量值)。以前该表是 MyISAM,完成如下:
UPDATE things t
JOIN (SELECT MAX(thing_id) + 1 AS max_id FROM things) v
SET t.thing_id = v.max_id
WHERE thing_id = 1;
那部分仍然有效。但是,现在使用 InnoDB,下一次插入失败,因为执行该更新会使表的自动增量值仍然指向同一事物。所以现在如果我现在像这样插入:
INSERT INTO things VALUES (NULL, 'thing 3');
我会收到如下错误:
键“PRIMARY”的重复条目“3”
这不是 MyISAM 的问题。如何使用 InnoDB 完成同样的事情而不会遇到此错误?我的猜测是有更好的方法来更改thing_id,这将保持表的自动增量值不变,但这就是我难住的地方。
最后,这是一个 dbfiddle: https://www.db-fiddle.com/f/enJPVkwNN6hocjquw38BHD/0
【问题讨论】:
-
你不应该操纵自动增量主键。如果您告诉我们更多有关您的流程的信息,我们可能会为您提供替代解决方案。
-
过程是,需要将一行的主键改为表中最高的。此应用程序没有其他选项。目前我最好的想法是复制该行并删除原始行。希望避免这种方法,但 InnoDB 无法应对这种方法是可行的。
-
提交错误报告:bugs..mysql.com --
UPDATE未能更新表的最大 AI 值。 -
@RickJames 好像已经是fixed in 8.0
-
@PaulSpiegel - 8.0.0 的变更日志讨论了与 AI 值的新“持续”相关的各种变更。其中一项暗示
UPDATE问题已得到修复(有意或无意)。
标签: mysql primary-key innodb auto-increment