Atomic Upsertの例 - Parallel Data Pump

Teradata® Parallel Data Pump リファレンス

Product
Parallel Data Pump
Release Number
17.00
Published
2020年6月
Language
日本語
Last Update
2021-01-07
dita:mapPath
ja-JP/ioq1544831946920.ditamap
dita:ditavalPath
ja-JP/ioq1544831946920.ditaval
dita:id
B035-3021
Product Category
Teradata Tools and Utilities

このセクションでは、Atomic UPSERT機能の仕組みを示す例(エラーが検出され、ユーザーに返される例など)をいくつか取り上げます。どの例にも、同じテーブル(Sales)を使用します。

CREATE TABLE Sales, FALLBACK,
(ItemNbr    INTEGER NOT NULL,
SaleDate   DATE FORMAT 'MM/DD/YYYY' NOT NULL,
ItemCount  INTEGER)
PRIMARY INDEX   (ItemNbr);

次のようなデータがテーブルに記入してあるとします。

INSERT INTO Sales (10, '05/30/2005', 1);

NewSalesと呼ばれるテーブルを想定します。この表の列定義は、テーブルSalesと同じであるとします。

例1 (エラー: 異なったターゲット テーブル)

ここでは、UPSERT文のUPDATE部とINSERT部に異なるテーブル名を指定した例を示します。

.Dml label upsertdml do insert for missing update rows;
UPDATE Sales SET ItemCount = ItemCount + 1 WHERE (ItemNbr = 10 AND SaleDate = '05/30/2005');
INSERT INTO NewSales (10,'05/30/2005', 1);

UPSERT文には、同じ文では1つのテーブルしか処理できないという規則があります。このUPSERT文には、SalesおよびNewSalesという別々のテーブルが使用されているため、UPDATEとINSERTの両方に同じ名前のテーブルを指定しなければならないことを示すエラーが返されます。

例2 (エラー: 異なったターゲット行)

ここでは、UPSERT文のUPDATE部とINSERT部に異なる基本索引値を指定した例を示します。

.Dml label upsertdml do insert for duplicate update rows;
UPDATE Sales SET ItemCount = ItemCount + 1 WHERE (ItemNbr = 10 AND SaleDate = '05/30/2005');
INSERT INTO Sales (20,'05/30/2005', 1);

UPDATEとINSERTの基本索引値は同じでなければなりません。同じでない場合、2つの異なる行、つまり、UPDATEの行とINSERTの行が生成され、upsertの目的から外れます。このUPSERT文には、異なる基本索引値(10および20)が指定されているため、エラー(UPDATEとINSERTの両方に同じ基本索引値を指定しなければならない)が返されます。

例3 (有効なUPSERT文のUPDATE)

ここでは、行を正常に更新するUPSERT文の例を示します。

.Dml label upsertdml do insert for missing update rows;
UPDATE Sales SET ItemCount = ItemCount + 1 WHERE (ItemNbr = 10 AND SaleDate = '05/30/2005');
INSERT INTO Sales (10, '05/30/2005', 1);

規則がすべて検証された後、ItemNbr = 10およびSaleDate = '05/30/2005'を持った行が更新されます。結果として、1行が正常に更新されます。

例4 (有効なUPSERT文のINSERT)

ここでは、行を正常に挿入するUPSERT文の例を示します。

.Dml label upsertdml do insert for missing update rows;
UPDATE Sales SET ItemCount = ItemCount + 1 WHERE (ItemNbr = 20 AND SaleDate = '05/30/2005')
INSERT INTO Sales (20, '05/30/2005', 1);

規則がすべて検証された後、UPDATE用のItem=20およびSaleDate='05/30/2005'の行が見つからなければ、ItemNbr=20の新しい行が挿入されます。