当你上传一行(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操作的确切细节。

虽然它没有提供替换的简写,但ON CONFLICT DO UPDATE应用得更普遍,因为它允许您基于先前存在的数据设置新值。例如:

INSERT INTO users (id, level)
VALUES (1, 0)
ON CONFLICT (id) DO UPDATE
SET level = users.level + 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;