UPSERT!
UPSERTとは、その見た目のイメージどおり、
レコードがあればUPDATE、レコードがなければINSERTをすること。
実際にはUPSERTではなく、MERGEという構文を使用する。(UPSERT文もあるのかな?)
つかMERGEの中にINSERTもUPDATEも書いてるし、意外に書くこと多い。
UPSERT使わない場合は、
SELECTしてからINSERTもしくはUPDATEかけるかな。
SELECT * FROM SAMPLE_TABLE WHERE PK1=? AND PK2=?
INSERT INTO SAMPLE_TABLE (PK1, PK2, COL1, COL2, COL3)
VALUES (?, ?, ?, ?, ?)
UPDATE SAMPLE_TABLE SET COL1=?, COL2=?, COL3=?
WHERE PK1=? AND PK2=?
サンプルがなかなか無くて困ったけど、
こんな感じのSQLができました。
ORACLEでは9から。他のDBにあるのかは知らないです。
MERGE INTO SAMPLE_TABLE
USING DUAL ON ( DUAL.DUMMY IS NOT NULL AND PK1=? AND PK2=? )
WHEN NOT MACHED THEN
INSERT VALUES (?, ?, ?, ?, ?)
WHEN MATCHED THEN
UPDATE SET COL1=?, COL2=?, COL3=?
「DUAL.DUMMY IS NOT NULL」はなくてもいけるかも。
UPDATEのとこでキーを入れないのがポイント。(入れるとエラー)
他テーブルからMERGEする場合には、
MERGE INTO T1 A USING (SELECT * FROM T2) B ON (A.PK = B.PK) ……
だったような気がする
SQLを呼ぶ側のプログラム的にはすっきりするし、
トランザクションとかも考えないで済むから、楽っちゃぁ楽だわな。
| 固定リンク
この記事へのコメントは終了しました。
コメント