"DO UPDATE SET" 未按预期工作

"DO UPDATE SET" not working as expected

我在 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 execute() 语句的参数,我传入数组 [7172, 10, 1, 1]

那个production_worktable对now()day参数有一个默认值这就是我不传进去的原因,还有一个唯一的约束集在为 ON CONFLICT 部分列出的三个字段上。

没有冲突时,它正确地将 sw 列的值设置为 1。但是,当有冲突时,sw 列的值当前为 0,然后此语句运行 sw 列,最终值为 2,而不是 1。

我做错了什么?

记录 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;