0

両方のテーブルで同じシーケンス生成値を使用して、外部キーによってリンクされた 2 つの異なるテーブルに明示的なデータを一括挿入したいと考えています。

INSERT ALL 命令を、連続する UNION ALL ステートメントで構成される WITH 句と一緒に使用して、それを実現しようとしています。

with 句が 256 行を超えない限り、すべて正常に機能します。別の UNION ALL エントリを追加するとすぐに、次のエラーが発生します。

ORA-02291: 整合性制約違反(MY_SCHEMA.FK_TABLE_B_TO_TABLE_A) - 親キーが見つかりません *原因: 外部キー値に一致する主キー値がありません。*処置: 外部キーを削除するか、一致する主キーを追加してください。

外部キー制約を無効にすると、すべてが正常に機能します (256 行を超える場合でも)。

私の指示は次のようになります:

insert all 
  into MY_SCHEMA.TABLE_A (ID, COLUMN_1, COLUMN_2)
    values (MY_SCHEMA.MY_SEQUENCE.nextval, COLUMN_1, COLUMN_2)
  into MY_SCHEMA.TABLE_B (ID, COLUMN_3) 
    values (MY_SCHEMA.MY_SEQUENCE.nextval, COLUMN_3) 

  with input_data as (
    select 11 COLUMN_1, 12 COLUMN_2, 13 COLUMN_3
      UNION ALL
    select 21 COLUMN_1, 22 COLUMN_2, 23 COLUMN_3
      UNION ALL
      ...
      UNION ALL
    select 31 COLUMN_1, 32 COLUMN_2, 33 COLUMN_3

  )
  select * from input_data;

そのような命令が処理できるデータ量に制限はありますか? または、他に何か不足していますか?

Oracle 11g と SQLDeveloper を使用しています。

4

1 に答える 1

3

マルチテーブル挿入を使用する場合は、すべての制約を無効にするか、削除することをお勧めします。いくつかの重要な制限があります。

  • シーケンスは使用しないでください
  • テーブルへの挿入順序は保証されていません

したがって、完全に有効なデータを挿入しても、FK 制約で失敗する可能性があります。とにかく、データをすばやく一括挿入したい場合は、FK がチェックされるのを待つ時間を無駄にしたくありません。

更新: 重複の可能性: https://dba.stackexchange.com/questions/23384/using-multi-table-insert-for-parent-and-child-table

Oracle のバグ (2891576) はまだ修正されていません。オラクルは回避策を提供しています:

解決策(ドキュメント ID 265826.1)

「Oracleがデータを挿入するテーブルの順序は決定されていません(保証されています。したがって、マルチテーブル挿入ステートメントを発行する前に、制約を延期し、マルチテーブル挿入操作の特定のテーブル順序に依存するトリガーを無効にする必要があります。」

回避策:

  1. このような MultiPath Inserts を実行するときは、外部キーを無効にします。
  2. DEFERRED CONSTRAINTS を使用して、コミット時にのみチェックアウトが行われるようにします。

Deferred Constraints チェックについて Metalink Note: 73647.1「Deferred Constraints Example」

于 2016-05-04T11:09:43.193 に答える