2015-04-07 60 views
1

我在Oracle TABLE_A和TABLE_B的兩個表中都有大約20000到30000條記錄。在Oracle數據庫的兩個表中交換外鍵

在表-B的記錄是通過外鍵鏈接到TABLE_A記錄 - (表-B包含TABLE_A的主鍵)

我需要交換的外鍵。即

我希望現在TABLE_A應該包含TABLE_B的主鍵。 (這是一個功能要求 - 因爲在前端的一些驗證,在當前形式的數據庫實現這些表上的更新是不可能的。)

此外,雖然這樣做,我想記錄從(TABLE_B - > TABLE_A)鏈接仍保持鏈接。 現在通過新的外鍵(TABLE_A - > TABLE_B)。

FOREIGN KEY可以通過幾個ALTER TABLE命令輕鬆移動,主要問題區域是保持數據並正確地重新鏈接它。

執行此操作最明顯的方法將涉及到備份整個表,然後創建新腳本以在兩個表中重新插入更新的數據。

有沒有更快的方法來做到這一點,沒有任何錯誤的機會。

+1

除非表格處於1:1關係 - 即。表A中的每一行在表B中都有一行,表B中的每一行在表A中都有一行 - 我沒有看到這個工作。如果他們是1:1,我不明白他們爲什麼是兩張桌子,而不是一張桌子。 –

+0

@DavidAldridge,1:1關係在超類/子類模型中很常見。在單個寬表中避免大量NULL列。 –

+0

@JeffreyKemp是的,我想是的 - 儘管引用子類表的超類開始會是相當錯誤的。 –

回答

1

假設以下結構:

TABLE_A (a_id [pk], ...) 
TABLE_B (b_id [pk], a_id, ...) 
    unique constraint on TABLE_B (a_id) 
    referential constraint TABLE_B (a_id) -> TABLE_A (a_id) 

你可以做這樣的事情,假設你的系統可以處理暫時故障:

ALTER TABLE TABLE_A ADD (b_id NUMBER); 

MERGE INTO TABLE_A t USING 
    (SELECT b_id, a_id FROM TABLE_B) s 
ON (t.a_id = s.a_id) 
WHEN MATCHED THEN UPDATE 
    SET t.b_id = s.b_id; 

ALTER TABLE TABLE_A ADD CONSTRAINT a_b_fk 
    FOREIGN KEY (b_id) REFERENCES TABLE_B (b_id); 

ALTER TABLE TABLE_B DROP COLUMN a_id; 

因爲只有30K的記錄應該採取很少的時間。

上述缺失的唯一缺點是刪除TABLE_B上的舊主鍵約束並在TABLE_A(b_id)上添加新的主鍵約束。

+0

感謝您的回答,它工作正常。只是我想指出的一點是,您提到的最後一步不會被要求,因爲我們仍然需要b_id作爲TABLE_B的主鍵。對於TABLE_A,主鍵仍然是a_id。 另外,在MERGE語句的語法中,USING關鍵字缺失我已經建議在您的答案中對其進行編輯。 – sumit

+0

非常感謝您的支持。 –

相關問題