2013-02-05 14 views
5

Chcę wybrać pola w rekordzie tabeli i zaktualizować tylko jedno z tych pól. Jak mogę zrobić?Wybierz opcję Aktualizuj w PostgreSql

próbuję to:

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; 

Ale w ten sposób ustawia pole "schedulingflag" true we wszystkich rekord!

Odpowiedz

12

Składnia SELECT FOR UPDATE mówi PG, że zamierzasz aktualizować te rekordy i blokuje je przed równoczesnym dostępem. Jednak nadal musisz wydać odpowiednie wywołanie UPDATE, aby zmienić zablokowane dane.

W tym przypadku, po prostu korzystać z tego samego WHERE klauzulę w swoim UPDATE, np:

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

Cześć, chcę zablokować tabeli, można zobaczyć moje poprzednie pytanie? http://stackoverflow.com/questions/14707002/lock-table-in-postgresql#comment20571089_14707002 –

+0

Będę musiał sprawdzić, ale proszę oznaczyć tę odpowiedź jako zaakceptowaną, jeśli rozwiązuje problem. –

+1

Należy zauważyć, że używa on LIMITU 1 w FOR FOR UPDATE, to zazwyczaj oznacza, że ​​jego klauzula where może zwrócić więcej niż 1 rekord. Teraz, ponieważ nie mam jego DDL dla tabeli, powinien użyć tego, co jest jego kluczem podstawowym do aktualizacji, jeśli jego idvideo, to powinien użyć UPDATE wideo SET scheduleflag = true WHERE idvideo = ?. Powodem jest to, że nawet jeśli użyje tego samego zapytania (ORDER BY/LIMIT), może NASTĘPNIE zaktualizować inny rekord (przed nim można wstawić nowy identyfikator) – Rahly

Powiązane problemy