使用潜在冲突更新主键字段

时间:2013-03-15 20:31:17

标签: mysql sql

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

目前我的ids是:

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

要做更新我试过:

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

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

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

更新:由于我需要更新旧版表,因此需要这样做。我不是在寻找有关数据库设计的建议,而是我将如何完成此更新。

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

好吧,虽然我们缺少更简单的问题解决方案,但您可以

  1. 创建具有相同结构的临时表
  2. INSERT INTO TEMP_TABLE SELECT id*10, --all other fields。这不会导致id冲突。
  3. 从原始表中删除所有数据
  4. 执行并INSERT INTO从临时表返回到原始表
  5. 重要提示:请确保在此之前进行备份。

答案 2 :(得分:1)

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

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

这可以防止任何冲突,因为更高的值会先更新。