2016-08-05 11 views
0

私はPHPでのPDOライブラリを使用していると私はこのようなPostgreSQLの文で生成しています: 「UPDATEのSETをDO」期待通りに動作しない

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]を渡しています。

dayパラメータのデフォルト値はnow()です。その理由は、私が渡していない理由と、ON CONFLICTの3つのフィールドに一意の制約が設定されているためです。競合がない場合には

競合があるとき、それは正しく、ただし1へsw列の値を設定することだ、とそのsw列の値は、この文はsw列がで終わる実行し、その後の後、現在は0であります2ではなく1の値です。

私は間違っていますか?

答えて

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; 
+0

興味深いです。だから私は私の例を単純化しました。 swと並んで、私はそれと同じように使用している列がさらに約10あります。更新部分にそれらをすべてリストする必要がありますか? – Gargoyle

+0

はい、更新するすべての列を設定する必要があります。 – klin

+0

ありがとう!私は今夜​​帰宅するときにこれを試してみる。 – Gargoyle