2013-02-05 9 views
5

Ich möchte Felder in einem Datensatz einer Tabelle auswählen und nur eines dieser Felder aktualisieren. Wie kann ich?Wählen Sie für Update-Anweisung in PostgreSql

Ich versuche dies:

SELECT v.idvideo, v.title 
FROM video v WHERE v.schedulingflag IS FALSE AND v.errorflag IS FALSE 
ORDER BY v.idvideo LIMIT 1 FOR UPDATE ; 

UPDATE video SET schedulingflag = true; 

Aber auf diese Weise setzt es Feld "schedulingflag" true in allen Rekord!

Antwort

12

Die Syntax SELECT FOR UPDATE teilt PG mit, dass Sie diese Datensätze aktualisieren und sie gegen den gleichzeitigen Zugriff sperren. Sie müssen jedoch weiterhin den entsprechenden Aufruf UPDATE eingeben, um die bestimmten gesperrten Datensätze zu ändern.

In diesem Fall verwenden Sie einfach die gleiche WHERE Klausel in Ihrem UPDATE, z:

UPDATE video SET schedulingflag = true 
WHERE schedulingflag IS FALSE AND errorflag IS FALSE; 
+0

Hallo, ich möchte die Tabelle sperren, können Sie meine vorherige Frage sehen? http://stackoverflow.com/questions/14707002/lock-table-in-postgresql#comment20571089_14707002 –

+0

Ich werde einen Blick, aber bitte markieren Sie diese Antwort als akzeptiert, wenn es Ihr Problem löst. –

+1

Beachten Sie, dass er ein LIMIT 1 für das FOR UPDATE verwendet, dies bedeutet im Allgemeinen, dass seine WHERE-Klausel mehr als 1 Datensatz zurückgeben kann. Jetzt, da ich nicht seine DDL für den Tisch habe, sollte er, was auch immer sein Primärschlüssel ist, um das Update zu tun, wenn sein Idvideo, dann sollte er UPDATE Video verwenden SET scheduleflag = wahr WHERE idvideo = ?. Der Grund dafür ist, dass er selbst dann, wenn er dieselbe Abfrage verwendet (ORDER BY/LIMIT), einen anderen Datensatz STILL aktualisieren könnte (davor könnte eine neue ID eingefügt werden). – Rahly

Verwandte Themen