我有一个需要乘以 10 来更新的主键字段。
目前我的身份证是:
`id`
- 1
- 2
- ...
- 10
- 11
- etc.
要进行我尝试的更新:
START TRANSACTION;
UPDATE status SET id = id*10;
COMMIT;
但是,我收到了 pk 投诉(因为 1*10 = 10,这是当前的主键)。
我将如何解决此问题并进行此更新?
更新:由于我需要更新旧表,这是必需的。我不是在寻找关于 db 设计的建议,而是我将如何完成这个更新。
您的主键应该用于唯一标识每一行......不提供任何类型的排序。您不应该通过操作主键来尝试在其他项目之间放置项目。
相反,OrderID如果您需要能够硬编码这些行的任意顺序,请考虑向表中添加一列。
您可以在更新查询中提供 ORDER BY 语句:
UPDATE status SET id = id*10 ORDER BY id DESC;
这应该可以防止任何冲突,因为首先更新较高的值。
好吧,虽然我们对您的问题缺乏更巧妙的解决方案,但您可以
INSERT INTO TEMP_TABLE SELECT id*10, --all other fields. 这不会导致 id 冲突。INSERT INTO返回到原始表重要提示:请确保在此之前进行备份。