2013-03-15 25 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