【PostgreSQL】レコードが存在すればUPDATE、なければINSERTを1クエリで実現する

昔の記事の関連みたいなもの。
【PostgreSQL】レコードが存在すればUPDATE、なければINSERTをSQL文で実現する
最近っぽいやり方で1クエリで実現する。

※PostgreSQLのバージョンが9.5以上でないと使えないはず。

環境:

  • PostgreSQL:9.6.3

例として、テーブル定義は下記の状態とする。

emailの有無によりINSERTかUPDATEかを判別するという想定。

テーブルの内容は下記。

emailがPRIMARY KEYの為、当然emailに存在する値をINSERTしようとするとエラーとなる。

そこで、下記のSQL文とする。

2行目がカギで、emailが重複していた場合はnameとpasswordをUPDATE、していなければINSERT、となる。

実行後のテーブルの状態は下記。

当然、emailが重複していなければ普通にINSERTが行われる。

注意点として、CONFLICTに指定するカラムはUNIQUEである必要がある。
通常のカラムの場合は動作しない為注意。

シェア: