16.20 - 例: MERGEおよび識別列 - Teradata Database - Teradata Vantage NewSQL Engine

Teradata Vantage™ SQLデータ操作言語

Product
Teradata Database
Teradata Vantage NewSQL Engine
Release Number
16.20
Release Date
2019年3月
Content Type
プログラミング リファレンス
Publication ID
B035-1146-162K-JPN
Language
日本語 (日本)

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);