小编典典

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

all

当您更新一行时(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')

阅读 56

收藏
2022-07-01

共1个答案

小编典典

Postgres 没有实现与INSERT OR REPLACE. 从ON CONFLICT文档(强调我的):

它可以是 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;
2022-07-01