当您正在向上插入一行(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;