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;