0

我有一个需要乘以 10 来更新的主键字段。

目前我的身份证是:

`id`
- 1
- 2
- ...
- 10
- 11
- etc.

要进行我尝试的更新:

START TRANSACTION;
UPDATE status SET id = id*10;
COMMIT;

但是,我收到了 pk 投诉(因为 1*10 = 10,这是当前的主键)。

我将如何解决此问题并进行此更新?

更新:由于我需要更新旧表,这是必需的。我不是在寻找关于 db 设计的建议,而是我将如何完成这个更新。

4

3 回答 3

3

您的主键应该用于唯一标识每一行......不提供任何类型的排序。您不应该通过操作主键来尝试在其他项目之间放置项目。

相反,OrderID如果您需要能够硬编码这些行的任意顺序,请考虑向表中添加一列。

于 2013-03-15T20:33:50.787 回答
1

您可以在更新查询中提供 ORDER BY 语句:

UPDATE status SET id = id*10 ORDER BY id DESC;

这应该可以防止任何冲突,因为首先更新较高的值。

于 2013-03-15T20:52:47.660 回答
1

好吧,虽然我们对您的问题缺乏更巧妙的解决方案,但您可以

  1. 创建具有相同结构的临时表
  2. 做一个INSERT INTO TEMP_TABLE SELECT id*10, --all other fields. 这不会导致 id 冲突。
  3. 从原始表中删除所有数据
  4. 从临时表执行并INSERT INTO返回到原始表

重要提示:请确保在此之前进行备份。

于 2013-03-15T20:37:23.910 回答