PostgreSQL INSERT ON CONFLICT UPDATE(upsert)使用所有排除的值

当你插入一行(PostgreSQL> = 9.5)时,你希望可能的INSERT和可能的UPDATE完全一样,你可以这样写:

INSERT INTO tablename (id, username, password, level, email) VALUES (1, 'John', 'qwerty', 5, 'john@mail.com') ON CONFLICT (id) DO UPDATE SET id=EXCLUDED.id, username=EXCLUDED.username, password=EXCLUDED.password, level=EXCLUDED.level,email=EXCLUDED.email 

有一个更短的路? 只是说:使用所有的EXCLUDE值。

在SQLite中,我曾经这样做过:

 INSERT OR REPLACE INTO tablename (id, user, password, level, email) VALUES (1, 'John', 'qwerty', 5, 'john@mail.com') 

Postgres还没有实现INSERT OR REPLACE的等价物。 从ON CONFLICT文档 (重点是我的):

它可以是DO NOTHING,也可以是DO UPDATE子句,指定在发生冲突时要执行的UPDATE操作的确切细节

虽然它不能给你简写replace,但是ON CONFLICT DO UPDATE更一般地适用,因为它允许你根据预先存在的数据设置新的值。 例如:

 INSERT INTO users (id, level) VALUES (1, 0) ON CONFLICT (id) DO UPDATE SET level = users.level + 1;