PostgreSQL 9.5では、これはネイティブ機能になりました(MySQLが数年前から持っていたように):
INSERT ... ON CONFLICT DO NOTHING / UPDATE( "UPSERT")
9.5は、「UPSERT」操作のサポートをもたらします。INSERTは、ON CONFLICT DO UPDATE/IGNORE句を受け入れるように拡張されています。この条項は、重複違反が発生した場合に実行する代替アクションを指定します。
...
新しい構文のさらなる例:
INSERT INTO user_logins (username, logins)
VALUES ('Naomi',1),('James',1)
ON CONFLICT (username)
DO UPDATE SET logins = user_logins.logins + EXCLUDED.logins;