当您要插入一行(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')
答案 0 :(得分:105)
Postgres尚未实现与INSERT OR REPLACE
相当的效果。来自ON CONFLICT
docs(强调我的):
可以是DO NOTHING,也可以是DO UPDATE子句,指定在发生冲突时要执行的UPDATE操作的完全详细信息。
虽然它没有为您提供替换的简写,但ON CONFLICT DO UPDATE
更常适用,因为它允许您根据预先存在的数据设置新值。例如:
INSERT INTO users (id, level)
VALUES (1, 0)
ON CONFLICT (id) DO UPDATE
SET level = users.level + 1;