例: MERGEおよび識別列 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ操作言語

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
Published
2021年1月
Language
日本語
Last Update
2021-03-30
dita:mapPath
ja-JP/vnq1596660420420.ditamap
dita:ditavalPath
ja-JP/vnq1596660420420.ditaval
dita:id
B035-1146
Product Category
Software
Teradata Vantage

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