« ストレスかな | トップページ | ほどほど »

2004.10.02

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を呼ぶ側のプログラム的にはすっきりするし、
トランザクションとかも考えないで済むから、楽っちゃぁ楽だわな。

|

« ストレスかな | トップページ | ほどほど »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: UPSERT!:

« ストレスかな | トップページ | ほどほど »