PostgreSQL冲突更新时插入(upsert)使用所有排除的值

当您正在向上插入一行(PostgreSQL>=9.5),并且希望可能的插入与可能的更新完全相同时,可以这样编写:

插入tablename(id、用户名、密码、级别、电子邮件)
值(1,'John','qwerty',5,'[email protected]') 
在冲突(id)上执行更新集
id=EXCLUDED.id,username=EXCLUDED.username,
密码=已排除。密码,级别=已排除。级别,电子邮件=已排除。电子邮件

有较短的路吗?也就是说:使用所有排除值

在SQLite中,我曾经做过:

在tablename中插入或替换(id、用户、密码、级别、电子邮件)
值(1,'John','qwerty',5,'[email protected]')

Postgres尚未实现与插入或替换相当的功能。从冲突的文档中(重点):

它可以是DO NOTHING,也可以是DO UPDATE子句,指定发生冲突时要执行的更新操作的确切细节

虽然它不能为您提供替换的简写,但冲突DO UPDATE上的应用更为广泛,因为它允许您根据预先存在的数据设置新值。例如:

插入用户(id、级别)
值(1,0)
在冲突(id)上执行更新
设置级别=用户。级别+1;

发表评论