Skip to content

Instantly share code, notes, and snippets.

@kwatch
Created May 9, 2014 03:29
Show Gist options
  • Save kwatch/669a90687b3311927612 to your computer and use it in GitHub Desktop.
Save kwatch/669a90687b3311927612 to your computer and use it in GitHub Desktop.
Upsert on PostgreSQL
/* ref: http://lets.postgresql.jp/documents/technical/9.1/1 */
create table members (
id serial primary key
, name varchar(255) not null unique
, gender char(1) not null -- 'F': female, 'M': male
, role varchar(255)
);
-- Run 'update' statement, or run 'insert' statement when failed.
-- 先に update 文を実行し、それが失敗したら insert 文を実行する
with _updated as (
update members
set gender = 'F'
, role = 'Leader'
where members.name = 'Haruhi'
returning true as result -- Return true when updated successfully, or null when failed.
-- 該当行が見つかって update が成功したら true を返し、そうでなければ null を返す
)
insert into members (name, gender, role)
select 'Haruhi', 'F', 'Leader'
where ( select result from _updated ) is null -- Run 'insert' statement only when 'update' statment is failed.
-- update 文が成功しなかったときだけ insert 文を実行
;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment