我在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。
我做错了什么?
答案 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;