2013-03-15 52 views
0

我有我需要通过10更新主键字段与潜在的碰撞

乘以更新主键字段目前我的ID是:

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

要做到我尝试了更新:但是,我得到了一个pk投诉(因为1 * 10 = 10,这是一个当前的主键)。

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

更新:由于我需要更新旧表,因此需要这样做。我不是在寻找关于数据库设计的建议,而是从字面上看我会如何完成这个更新。

+0

这是一个坏主意。 PK应该只是*唯一标识符* - 没有别的。 – 2013-03-15 20:36:10

回答

1

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

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

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

3

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

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

+0

没错,这是更新的遗留代码,没有在第一个额外的列(我有很多条目引用ID为FK)。 – David542 2013-03-15 20:34:55

+1

@ David542有很多条目引用id作为FK *是让它独立的另一个很好的理由。现在您还需要更改所有这些表格。 – 2013-03-15 20:43:02

1

好了,而我们缺少一个更漂亮的解决您的问题,您可以

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

重要:请确保您在此之前做一个备份。

+0

非常感谢您提出如何解决此问题的建议。 – David542 2013-03-15 20:37:58