テーブルが(UNIQUE制約なしで)MULTISETとして作成されて重複行が可能になっている場合を除いて、システムは常に更新処理の際に重複行をチェックします。更新が実行される順序は、トランザクションの結果に影響することに注意してください。
次の例について考えてみます。
CREATE SET TABLE t1 ( a INTEGER, b INTEGER) PRIMARY INDEX (a); INSERT INTO t1 VALUES (1,1); INSERT INTO t1 VALUES (1,2); UPDATE t1 SET b = b + 1 WHERE a = 1; /* fails */ UPDATE t1 SET b = b - 1 WHERE a = 1; /* succeeds */
最初のUPDATEリクエストは、重複行を作成するので失敗します。
UPDATEリクエストの順序が逆の場合には、UPDATEによって重複行が作成されないため、両方のUPDATEリクエストともに成功します。
CREATE SET TABLE t1 ( a INTEGER, b INTEGER) PRIMARY INDEX (a); INSERT INTO t1 VALUES (1,1); INSERT INTO t1 VALUES (1,2); UPDATE t1 SET b = b - 1 WHERE a = 1; /* succeeds */ UPDATE t1 SET b = b + 1 WHERE a = 1; /* succeeds */
このモードは単純な更新と結合更新の両方の特徴です。それに対して、プライマリ インデックスまたはセカンダリ インデックスの値に影響を与える更新は、別個の削除および挿入操作として実装されます。