我有一個相當大的數據庫與一個主表的GUID(自定義GUID像算法)主鍵和8個子表與外鍵關係GUID列。所有的表格都有大約3-8百萬條記錄。這些表中沒有任何BLOB/CLOB/TEXT或任何其他花哨的數據類型,只有正常的數字,變量,日期和時間戳(每個表中大約15-45列)。除主鍵和外鍵之外,沒有分區或其他索引。更新大表的主表和子表的主鍵
現在,自定義GUID算法已更改,雖然沒有衝突,但我想遷移所有舊數據以使用使用新算法生成的GUID。沒有其他列需要更改。首要任務是數據完整性,性能是次要的。
一些我能想到的可能的解決方案的人(因爲你可能會發現它們都圍繞着只有一個想法)
- 添加新列ngu_id和新gu_id填充;禁用約束;用ngu_id作爲gu_id更新子表; renaname ngu_id-> gu_id;重新啓用約束條件
- 從子表讀取一條主記錄及其相關的子記錄;用新的gu_id插入到同一個表中;使用舊gu_id刪除所有記錄
- 下降約束;向主表添加觸發器,以便更新所有子表;用新的gu_ids開始更新舊的gu_id;重新啓用約束
- 向主表添加觸發器,以便更新所有子表;用新的新gu_id開始更新舊的gu_id
- 在所有主表和子表上創建新的列ngu_ids;在ngu_id列上創建外鍵約束;將更新觸發器添加到主表以將值級聯到子表;將新的gu_id值插入ngu_id列;基於gu_id刪除舊的外鍵約束;刪除gu_id列並將ngu_id重命名爲gu_id;必要時重新創建約束;
- 使用
on update cascade
如果有的話?
我的問題是:
- 有沒有更好的辦法? (不能把我的頭埋在沙裏,得這麼做)
- 什麼是最合適的方法來做到這一點? (我必須在oracle,sqlserver和mysql4中執行此操作,因此歡迎使用特定的供應商)
- 這種練習的典型失敗點以及如何最小化它們?
如果你是我到目前爲止,謝謝你,希望你能幫助:)