2009-12-04 31 views
0

我們的應用程序使用Oracle 10g數據庫,其中幾個主鍵都暴露給最終用戶。產品代碼等。不幸的是,由於有大量的報告和自定義腳本,我們無法控制,所以很難做到這一點。我們不能重新定義主鍵或弄亂數據庫結構。如何在Oracle中重命名主鍵值?

現在有些客戶想要更改一些主鍵值。他們最初想叫P23A1,現在應該叫CAT23MOD1(不是一個真實的例子,但你明白我的意思。)

是否有一個簡單的方法來做到這一點?我更喜歡某種腳本,可以通過參數化來適應其他表和鍵,但如果沒有其他方式存在,外部工具也是可以接受的。

回答

0

糟糕。有一點Google使得看起來,莫名其妙地,Oracle沒有實現ON UPDATE CASCADE,只有ON DELETE CASCADE。要找到解決方法谷歌ORACLE ON UPDATE CASCADE。這裏是Oracle中的Creating A Cascade Update Set of Tables的鏈接。

原來的答覆:

如果我理解正確的,你想改變值主鍵列數據的,而不是密鑰本身的實際約束名稱。

如果這是事實,就可以很容易地實現重新定義所有引用受影響的主鍵約束爲ON UPDATE CASCADE外鍵。這意味着當您對主鍵值進行更改時,引擎將自動更新外鍵表中的所有相關值。

注意,如果這導致了很大的變化也可能是在生產系統中昂貴。

+0

IME,我們將禁用約束和按表格更新。單調乏味...... –

+0

從這個問題來看,我認爲他們沒有能力禁用約束條件,聽起來最終用戶希望這種能力持續存在,而不是作爲一次性工作。除了在更新PK表時編寫一個非常難看的觸發器之外,我沒有看到任何其他選項。 –

+0

@Larry:是的,這是值得改變的。 @OMG:是的,非常乏味:-(你有一個有趣的方式來做到這一點?:-) –

0

如果你必須這樣做,沒有DDL更改涉及到的表在實際系統上,那麼我認爲你唯一的選擇是(對於需要改變的PK的每個值):

  1. 插入到父表中的行與PK值的副本替換
  2. 對於每個子表,更新FK值到新的PK值
  3. 與老PK值
刪除父錶行

如果您有父表的列表以及要重命名的PK值,編寫這樣的過程應該不會太困難 - USER_CONSTRAINTS中的信息可用於獲取給定父級的FK相關表表。