-3

このようなデータ移行スクリプトが 1 つあります。

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 ステートメントを実行すると、エラーは発生しません。この背後にある理由。そして、これを解決する方法。

4

1 に答える 1

5

一意性制約の失敗は、主キー列が衝突するレコードを1つ以上挿入しようとしていることを意味します。

スクリプトを実行したときに発生するが、個々のステートメントを実行したときに発生しない場合は、スクリプトにバグがあるはずです。スクリプトを見ないと、そのバグが何であるかを確認することはできませんが、最も可能性の高いのは、同じステートメントを2回実行していることです。

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

制約を有効にせずにデータ移行を実行するのが一般的です。その後、EXCEPTIONSテーブルを使用してそれらを再度有効にします。これにより、問題の調査が容易になります。 詳細をご覧ください

于 2011-11-09T06:11:33.273 に答える