このセクションでは、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の新しい行が挿入されます。