2011-11-09 8 views
-3

私はこのようなデータ移行スクリプトを1つ持っています。私は、スクリプトを実行したときに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

ユニーク制約の障害は、主キー列が衝突するレコードを1つ以上挿入しようとしていることを意味します。

スクリプトを実行しても個々のステートメントを実行しないときに発生する場合は、にスクリプトのバグが存在する必要があります。スクリプトを見ることなく、バグの内容を確認することは不可能ですが、最も可能性の高いことは何とか同じステートメントを2回実行していることです。

もう1つの考えられる原因は、制約が延期されることです。これは、トランザクションが終了するまで強制されないことを意味します。したがって、後続のCOMMITを発行せずにINSERTステートメントを実行すると、INSERTステートメントは成功したように見えます。

有効な制約なしでデータの移行を実行するのが一般的です。後でEXCEPTIONSテーブルを使用して再度有効にします。これにより、問題の調査が容易になります。 Find out more

+0

Phil:ありがとうございます。 – realn

+0

私は主キー違反があることを知っていました。 :D 私は個々のステートメントが動作する理由と、SQLファイル内の同じステートメントが私にエラーを与えているのかと尋ねています。 – realn