2012-02-29 49 views
0

我有一個數據轉儲,然後我想將它導入到另一個數據庫(Oracle 10g)。目標數據庫已經有表(無數據)和一些外鍵約束。我將通過表導入數據以避免約束錯誤。如果有人知道更簡單的方法,請教我? (Oracle的導入工具不具備自動識別表之間關係的功能,是不是?)ORACLE 10g:如何導入沒有外鍵約束錯誤?

+0

如果(由於某種原因)您不想使用@JustinCave解決方案,則可以在user_constraints表上循環並禁用首先外鍵約束在導入數據後,再次啓用它們。但是如果我是你,我不會這樣做...... – 2012-02-29 16:41:04

回答

1

假設您有模式級導出,源模式具有相同的外鍵約束,並且所有外鍵約束都是在同一模式的表之間,導入實用程序應自動處理外鍵約束。您不需要爲此做任何事情(當然,當您執行導入時,您將不得不忽略錯誤,因爲它會嘗試創建表並獲取它們已存在的錯誤)。

+0

在類似於11g XE的提問者的情況下,我將'imp ignore = Y touser = foo'用於預先存在的模式,並且它扼殺了FK限制。它按字母順序處理表格,我沒有看到它會自動照顧FKs?它似乎要做的就是最終啓用它們,但如果它們已經存在,那不會有幫助。 – 2015-02-03 13:10:57

4

您可以禁用的外鍵第一:

begin 
    for cnst in (SELECT constraint_name, table_name FROM user_constraints WHERE constraint_type ='R') loop 
    execute immediate 'alter table '|| cnst.table_name||' disable constraint ' || cnst.constraint_name ; 
    end loop; 
end; 

加載數據做同樣的,讓他們回來後(只需更改alter table命令enable而不是disable

但這是有風險,因爲如果數據不符合您的約束 - 您將遇到問題...