" DO UPDATE SET"没有按预期工作

时间:2016-08-05 00:00:14

标签: sql postgresql unique upsert postgresql-9.5

我在PHP中使用PDO库,并且我正在生成这样的PostgreSQL语句:

INSERT INTO production_work (order_id, producer_id, sw)
VALUES (?,?,?)
ON CONFLICT (order_id, producer_id, day)
DO UPDATE SET sw = EXCLUDED.sw + ?
RETURNING ident

并且对于PDO的参数执行()语句我传入数组[7172, 10, 1, 1]

该production_work表具有day now()参数的默认值,这就是我没有传递它的原因,并且为{列出的三个字段设置了唯一约束{1}}部分。

如果没有冲突,则会将ON CONFLICT列的值正确设置为1.但是,如果存在冲突,则该sw列的值当前为0,然后在运行此语句后,sw列的值最终为2,而不是1。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

记录EXCLUDED包含要插入但导致冲突的值,因此在这种情况下EXCLUDED.sw = 1。没有必要再添加1:

INSERT INTO production_work (order_id, producer_id, sw)
VALUES (?,?,?)
ON CONFLICT (order_id, producer_id, day)
DO UPDATE SET sw = EXCLUDED.sw
RETURNING ident;

如果要将给定值添加到现有值,请使用:

INSERT INTO production_work (order_id, producer_id, sw)
VALUES (?,?,?)
ON CONFLICT (order_id, producer_id, day)
DO UPDATE SET sw = sw + EXCLUDED.sw
RETURNING ident;