kyoagunのブログ

技術系、PdMについてを書いていこうと思います。

PostgreSQLでUPDATE、INSERT(UPSERT)を同時に処理させる

PostgreSQLで「あればUPDATE、なければINSERT」のUPSERTを実現する万能な方法を紹介します。
※古いバージョンのPostgreSQLで対応。

文法

UPDATE 
    テーブル名
SET 
    カラム名1 = 更新値1,
    カラム名2 = 更新値2
WHERE カラム名3 = カラム名3の条件値;
INSERT INTO テーブル名 (カラム名1, カラム名2, カラム名3)
SELECT 更新値1, 更新値2, カラム名3の条件値
WHERE NOT EXISTS (SELECT 1 FROM テーブル名 WHERE カラム名3 = カラム名3の条件値)

サンプル

UPDATE 
    product
SET 
    name = '{$name}',
    price = '{$price}'
WHERE id = '{$id}';
INSERT INTO product(id, name, price)
SELECT '{$id}', '{$name}', '{$price}'
WHERE NOT EXISTS (SELECT 1 FROM product WHERE id = '{$id}')

以上です。