MERGE
これらのケースについては、いくつかの成熟した DBMS に
文があります。同時にMERGE
です。INSERT
UPDATE
一般的な構文例:
MERGE INTO TABLE_NAME USING table_reference ON (condition)
WHEN MATCHED THEN
UPDATE SET column1 = value1 [, column2 = value2 ...]
WHEN NOT MATCHED THEN
INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...
MySQL のような一部の DBMS には、同じ考え方を持つ独自の構文があります。ウィキペディアで詳細を参照してください。
DBMS がそれをサポートしない場合は、同じロジックでストアド プロシージャを作成できます。
しかし、ストアド プロシージャまたは挿入前のコード内のその他の種類のチェックにより、「ラグ」が発生し、操作が「非アトミック」になります。これは、チェックの直後で挿入の前に、別のトランザクションが重複レコードを作成し、予期しない重複または例外が発生する可能性があることを意味します。これを回避するには、この操作の前にテーブルをロックして、テーブルへの排他的アクセスを取得する必要があります。これには、アクセスのシリアライゼーションによるポーフォマンス ペナルティがあります。
INSERT
または、次のSELECT
ように使用できます。
INSERT (field1, ...) INTO table1
SELECT value1, ...
FROM DUAL -- put a name of analogue of Oracle's DUAL here
WHERE NOT EXISTS (
SELECT 1
FROM table1
WHERE key = :new_key
)
しかし、ご理解のとおり、何も更新されません。