PostgreSQL Upsert(On Conflict),在Insert和Update中具有相同的值

时间:2016-10-06 09:55:50

标签: postgresql postgresql-9.6

在Insert ... On Conflict statment中使用相同的值时,我可以简化语法吗?

INSERT INTO cars 
  (car_id, car_type, car_model) 
values
  (1, 'tesla', 'model s')
ON CONFLICT (car_id) DO UPDATE SET 
  car_type = 'tesla',
  car_model = 'model s';

还有更多此类语句,因为它们是在每次应用程序更新时运行的脚本的一部分。

基本上我正在寻找一种不两次指定相同值的方法。

1 个答案:

答案 0 :(得分:3)

使用excluded关键字:

INSERT INTO cars 
  (car_id, car_type, car_model) 
values
  (1, 'tesla', 'model s')
ON CONFLICT (car_id) DO UPDATE SET 
  car_type = excluded.car_type,
  car_model = excluded.car_model;

这也适用于多行,例如:

INSERT INTO cars 
  (car_id, car_type, car_model) 
values
  (1, 'tesla', 'model s'), 
  (2, 'toyota', 'prius')
ON CONFLICT (car_id) DO UPDATE SET 
  car_type = excluded.car_type,
  car_model = excluded.car_model;