2011-11-09 162 views
-3

我有一個像這樣的數據遷移腳本。sql錯誤 - 唯一約束

Data_migration.sql

它的內容是


insert into table1 select * from old_schema.table1; 
commit; 
insert into table2 select * from old_schema.table2; 
commit; 

而且table1pk_productname約束,當我執行腳本

SQL> @ "data_migration.sql" 

我會得到一個唯一的約束(pk_productname)違規。但是當我執行單個sql語句時,我不會得到任何錯誤。這背後的任何理由。以及如何解決這個問題。

+0

是否與old_schema.table1上的約束相同? –

+0

約束如何看起來像是什麼樣,表有沒有觸發器? – steve

+0

@Phil - 只有8個符合條件的問題。 – APC

回答

5

唯一約束失敗意味着您試圖插入主鍵列相互衝突的其中一個記錄。

如果它在運行腳本時發生,但不在運行單個語句時發生,則必須在腳本中存在一個錯誤。沒有看到腳本,我們不可能確定那個bug是什麼,但最有可能的是你以某種方式兩次運行相同的語句。

另一個可能的原因是約束被推遲。這意味着它不會在交易結束之前執行。因此,如果您運行INSERT語句而不發出後續COMMIT,INSERT語句似乎會成功。

在沒有啓用約束的情況下運行數據遷移很常見。之後使用EXCEPTIONS表重新啓用它們。這使得調查問題變得更容易。 Find out more

+0

菲爾:感謝您的信息 – realn

+0

我知道有一個主鍵違規。 :D 我在問爲什麼作爲一個單獨的聲明它的工作,並在SQL文件中的相同的聲明是給我一個錯誤。 – realn