2016-08-05 12 views
0

ich die PDO-Bibliothek in PHP und ich bin eine PostgreSQL-Anweisung wie folgt zu erzeugen:„UPDATE SET DO“ nicht wie erwartet funktioniert

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 

und für die Parameter der PDO execute() Erklärung Ich übergebe das Array [7172, 10, 1, 1].

Das production_work Tabelle einen Standardwert für den day Parameter von now() hat, weshalb ich es nicht passieren in und eine eindeutige Einschränkung auf die für den ON CONFLICT Teil aufgeführten drei Felder gesetzt.

Wenn es keinen Konflikt gibt, ist es Einstellung korrekt den Wert des sw Spalte 1. Wenn jedoch ein Konflikt ist, und der Wert dieser sw Spalte ist zur Zeit 0, dann nach dieser Anweisung wird die sw Spalte endet mit ein Wert von 2, nicht 1.

Was mache ich falsch?

Antwort

2

Der Datensatz EXCLUDED enthält Werte, die eingefügt werden sollten, aber den Konflikt verursacht haben, also EXCLUDED.sw = 1 in diesem Fall. Es besteht keine Notwendigkeit, um es noch 1 hinzuzufügen:

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; 

ich Sie einen angegebenen Wert in den bestehenden Anwendung hinzuzufügen:

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

Interessant. Also habe ich mein Beispiel vereinfacht. Zusammen mit sw habe ich etwa 10 weitere Spalten, die ich genau so benutze. Muss ich sie alle im Update-Teil auflisten? – Gargoyle

+0

Ja, Sie sollten alle Spalten einstellen, die Sie aktualisieren möchten. – klin

+0

Danke! Ich werde es versuchen, wenn ich heute Abend nach Hause komme. – Gargoyle

Verwandte Themen