2015-06-16 84 views
0

我正在更新最初設計不佳的表。該表目前有一個主鍵是供應商的名稱。這可以作爲許多其他表格的外鍵。這導致了供應商名稱初始輸入錯誤或需要修復的拼寫錯誤。由於這是關係的外鍵,所以這比它的價值更復雜。在Oracle中更改主鍵

當前架構: VENDOR_NAME(PK)Vendor_contact評論

需要的模式: ID(PK)VENDOR_NAME Vendor_contact評論

我想要更新的主鍵是自動生成的,數字鍵。供應商名稱字段需要保留,但不再是關鍵。我還需要更新其他表和聯接表上外鍵的值。

最好的辦法是在我的供應商表上創建一個新的數字標識列,crosswalk將供應商名稱標識爲id並添加一個新的外鍵,並將新的id作爲外鍵,放棄供應商的外鍵這些表上的名稱(根據this post),然後以某種方式將該ID標記爲主鍵,並取消標記供應商名稱?

還是有更簡化的方式做到這一點,這是不是很破碎?

重要的是要注意,只有5個用戶可以訪問這個表格,所以我可以在這些更新完成的一段時間內輕鬆關閉它們 - 這不是問題。

我正在使用SQLDeveloper和Python/Django。

+0

哪個版本的數據庫? – APC

+0

我們最近升級到12C。 – rockman

回答

0

您遇到的最大問題是在從屬表中引用VENDOR_NAME的所有應用程序代碼。不只是使用它加入父表,還依靠它來顯示名稱而不加入VENDOR。

因此,雖然擁有一個作爲外鍵的自然鍵是PITN,但改變這種情況可能會產生大量工作,並帶來邊際整體收益。在開始之前一定要獲得所有利益相關者的支持。

我想接近它的方式是這樣的:

  1. 做一個真正徹底的影響分析
  2. 確保您有完整的迴歸測試都依賴於賣方的數據
  3. 創建VENDOR_ID的功能對供應商提供的唯一鍵
  4. 添加VENDOR_ID所有從屬表
  5. 創建引用的所有從屬表二外VENDOR_ID
  6. 確保每當VENDOR_NAME出現VENDOR_ID都會填充。

最後一點可以通過在相關表上修改插入和更新語句或者使用觸發器來解決。您採取的方法將決定您的應用程序設計以及涉及的表格數量。如果可以的話,顯然你想避免所有這些觸發器的性能打擊。

在這一點上,你有一個基礎設施,將支持新的主鍵,但仍然使用舊的主鍵。你爲什麼想做這個?因爲您可以像這樣進入Production,而無需更改應用程序代碼。它使您可以選擇在更廣泛的時間範圍內移動應用程序代碼以使用VENDOR_ID。顯然,如果開發人員一直熱衷於編碼SELECT * FROM,您將遇到需要立即解決的問題。

修復所有代碼後,您可以從所有從屬表中刪除VENDOR_NAME,並將VENDOR_NAME切換爲唯一鍵並將VENDOR_ID切換到主表上的主鍵。

如果您使用11g,則應該查看基於版本的重新定義。它旨在使這種練習變得非常簡單。 Find out more

0

我會做這種方式:

  • 創建新的序列
  • 創建臨時表作爲選擇your_sequence.nextval,VENDOR_NAME,vendor_contact,從供應商的意見。
  • 原始表重命名爲類似vendor_old
  • 添加主鍵和其他約束到新表
  • 新表重命名爲舊名稱

測試是必不可少的,你必須保證沒有除非你完成這個工作,否則一個人正在處理數據庫。