【发布时间】:2016-07-21 10:39:12
【问题描述】:
当您更新一行时 (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')
【问题讨论】:
-
不是一个真正的答案,但您可以使用略短的符号:
INSERT INTO tablename (id, username, password, level, email) VALUES (1, 'John', 'qwerty', 5, 'john@mail.com') ON CONFLICT (id) DO UPDATE SET (username, password, level, email) = (EXCLUDED.username, EXCLUDED.password, EXCLUDED.level, EXCLUDED.email).几乎相同,但易于复制/粘贴/管理列列表 -
另一种选择是使用 jsonb 列,这样您就不必担心列
-
@foal 作为答案发布,这是一个非常有用的选择。
标签: postgresql upsert postgresql-9.5