Oracleのマルチテーブル挿入ステートメントを使用して、(外部キー制約のある)親テーブルと子テーブルに挿入しても安全ですか?
最小限の例で、into
リストの親テーブルが子テーブルの前にある限り、機能することがわかりました。これに依存できますか、それとも制約を延期可能にする必要がありますか?
いいえ、これに依存することはできません。 SQLは手続き型ではなく宣言型であるため、ステートメント内では実行順序を保証できません。全体INSERT ALL
ステートメントは単一のステートメントと見なされます( doc )。1つのINSERT
が別のステートメントの前にあることは保証できません。
定義により、INSERT FIRST
は、評価された条件を渡す最初のINTO
を実行する必要があります。 INSERT ALL
も同様に動作します。これはと表示されます。
DROP TABLE T1;
CREATE TABLE T1 AS (SELECT 'a' c1, 0 c2, 0 c3 FROM dual WHERE 1=2);
INSERT ALL
WHEN mod(x,2)<>0 THEN INTO T1 VALUES ('a', x, mod(x,2))
WHEN mod(x,2)=0 THEN INTO T1 VALUES ('b', x, mod(x,2))
SELECT Level x FROM dual CONNECT BY Level <=20;
COMMIT;
SELECT rowid, c1, c2, c3 FROM t1;
ただし、特定のプラットフォーム/バージョン/パッチセットで特定の動作を示すことができても、これが保証されるわけではありません。
Oracle-developer.net はそれを明示的に言っています:
iNSERT FIRSTステートメントの条件は、上から順に評価されます。 Oracleは、INSERT ALLステートメントではそのような保証をしません。
アイザック、
OracleはINSERTの順序を保証しないため、これに依存することはできません。これを行う正しい方法は、先に述べたように、遅延外部キー制約を使用することです。