INSERT句を指定する場合、ON句とINSERT句が有効な場合でも、ターゲット テーブルのプライマリ インデックスは識別列になることができません。
ただし、ソース リレーションが単一行のサブクエリーから作成される場合、またはINSERT句を指定しない場合は、ターゲット テーブルのプライマリ インデックスは識別列になることができます。
以下のテーブル定義に基づいて、次のルールと例について考えてみましょう。
CREATE TABLE t1 ( x1 INTEGER GENERATED ALWAYS AS IDENTITY, y1 INTEGER, z1 INTEGER) PRIMARY INDEX(x1); CREATE TABLE t2 ( x2 INTEGER, y2 INTEGER, z2 INTEGER) PRIMARY INDEX(x2) UNIQUE INDEX(y2);
ルールを説明すると、次のようになります。
- WHEN NOT MATCHED THEN INSERT句を指定しない場合、MERGEリクエストは、t1のプライマリ インデックスであり識別列でもあるx1に値を挿入しようとしないので、このリクエストは有効です。
例えば、次のMERGEリクエストは、WHEN NOT MATCHED THEN INSERT句が指定されていないので、有効です。
MERGE INTO t1 USING (SELECT x2, y2, z2 FROM t2 WHERE y2 = 1) ON x1 = x2 WHEN MATCHED THEN UPDATE SET y1 = y2;
- WHEN NOT MATCHED THEN INSERT句を指定する場合、MERGEリクエストは、t1のプライマリ インデックスであり識別列でもあるx1に値を挿入しようとするので、このリクエストは失敗し、要求元にエラーが返されます。
例えば、次のMERGEリクエストは、x2のプライマリ インデックスであり識別列でもあるx1に値t1を挿入するWHEN NOT MATCHED THEN INSERT句を指定しているので、失敗します。
MERGE INTO t1 USING (SELECT x2, y2, z2 FROM t2 WHERE y2 = 1) ON x1 = x2 WHEN MATCHED THEN UPDATE SET y1 = y2 WHEN NOT MATCHED THEN INSERT (x2, y2, z2);