2012-05-23 41 views
0

說我有一個表mySQL業務。如何更改mysql中的ID

每個「業務」中的ID是標題和位置的函數。它使編程更容易。

我還經常合併2家相同的企業等

說有一天,企業變革的冠軍,我想改變ID。我很少做的一項手術。

許多其他表格指向該業務。

那我該怎麼辦?

我應該創建新ID,然後將所有指向原始業務的關係更改爲新ID嗎?

是否有一個mysql命令可以更快地執行此操作?

任何示例代碼vb.net?

+0

如果您有使用「ON UPDATE CASCADE」定義的外鍵約束,您的更改將自動傳播到所有相關表。 – eggyal

回答

1

根據每個表及其設計使用的數據庫引擎,如果已配置了外鍵和表約束,則可能不需要執行任何操作。

首先要做的是檢查鏈接表的結構。要做到這一點,一個MySQL會話中運行show create table xyz和檢查:

  1. 如果使用InnoDB引擎
  2. 外鍵約束上表中存在

(外鍵只是任何真正的在使用InnoDB引擎時可以使用,你可以在其他引擎中請求它們,但是它們不會做任何事情。)

如果你很幸運能夠使用InnoDB引擎並且有適當的約束,如:

CONTRAINT `FK_businessID` FOREIGN KEY(`businessID`) REFERENCES `Business` (`ID`) 
    ON DELETE CASCADE ON UPDATE CASCADE 

在表中的定義。如果您確實看到類似的情況,您應該應該能夠安全地更改業務表中的ID,並且所有其他鏈接的表都應該跟隨。

如果沒有外鍵,但使用InnoDB引擎,在單個事務中修改的所有表中的信息,這樣,如果有什麼不出差錯做你的控制範圍之外的變化(連接丟失,查詢錯誤等),你可以回滾。

最後,如果你不使用InnoDB引擎,祝你好運。你將不得不冒險改變記錄本質上'動態'。你的主要選擇(個人喜好的順序):

  1. 制定出新的密鑰,並在表上使用多個更新,並希望他們所有的工作和當前正在使用的數據
  2. 創建一個新的不會影響到任何人用新ID記錄,將所有信息從初始記錄複製到新記錄,然後在鏈接表上使用多個更新,然後刪除原始記錄,同時希望一切正常,並且不會影響當前使用數據的任何人
  3. 用新ID創建新記錄,複製鏈接表中的所有記錄,檢查它,然後刪除最初的記錄
  4. 使用魔法

顯然,上述所有的,做很多(和我說很多)使你的頭腦之前的測試和備份。並且在最少數量的客戶使用數據庫的時候這樣做;換句話說,過夜。

+0

我用innodb。你確定innodb會自動改變所有的指針嗎?似乎刪除級聯就是這樣,當刪除時,它們被刪除。哦更新級聯 –

+0

它應該通過更新。用相似的結構敲擊幾個測試表並嘗試一下。記得!測試是你的朋友 – DaveyBoy

+0

我做到了。有用。 +1。被選爲最佳答案。非常感謝。 –