我有我需要通過10更新主鍵字段與潛在的碰撞
乘以更新主鍵字段目前我的ID是:
`id`
- 1
- 2
- ...
- 10
- 11
- etc.
要做到我嘗試了更新:但是,我得到了一個pk投訴(因爲1 * 10 = 10,這是一個當前的主鍵)。
我將如何解決此問題並執行此更新?
更新:由於我需要更新舊錶,因此需要這樣做。我不是在尋找關於數據庫設計的建議,而是從字面上看我會如何完成這個更新。
我有我需要通過10更新主鍵字段與潛在的碰撞
乘以更新主鍵字段目前我的ID是:
`id`
- 1
- 2
- ...
- 10
- 11
- etc.
要做到我嘗試了更新:但是,我得到了一個pk投訴(因爲1 * 10 = 10,這是一個當前的主鍵)。
我將如何解決此問題並執行此更新?
更新:由於我需要更新舊錶,因此需要這樣做。我不是在尋找關於數據庫設計的建議,而是從字面上看我會如何完成這個更新。
您可以在更新查詢BY語句提供一個ORDER:
UPDATE status SET id = id*10 ORDER BY id DESC;
這應該防止任何衝突,較高的值首先更新。
您的主鍵應該用於唯一標識每一行...不提供任何類型的排序。您不應該通過操縱主鍵來嘗試在其他項目之間調整項目。
如果您需要能夠爲這些行硬編碼任意排序,請考慮在表中添加OrderID
列。
沒錯,這是更新的遺留代碼,沒有在第一個額外的列(我有很多條目引用ID爲FK)。 – David542 2013-03-15 20:34:55
@ David542有很多條目引用id作爲FK *是讓它獨立的另一個很好的理由。現在您還需要更改所有這些表格。 – 2013-03-15 20:43:02
好了,而我們缺少一個更漂亮的解決您的問題,您可以
INSERT INTO TEMP_TABLE SELECT id*10, --all other fields
創建臨時表。這不會導致id衝突。INSERT INTO
刪除所有數據從臨時表返回到原來的表重要:請確保您在此之前做一個備份。
非常感謝您提出如何解決此問題的建議。 – David542 2013-03-15 20:37:58
這是一個壞主意。 PK應該只是*唯一標識符* - 沒有別的。 – 2013-03-15 20:36:10