2013-02-05 10 views
5

Desidero selezionare i campi in una registrazione di una tabella e aggiornare solo uno di questi campi. Come posso fare?Selezionare per la dichiarazione di aggiornamento in PostgreSql

provo questo:

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; 

Ma in questo modo pone campo "schedulingflag" vero in tutti i record!

risposta

12

La sintassi SELECT FOR UPDATE indica a PG che si stanno aggiornando quei record e li si blocca contro l'accesso simultaneo. Tuttavia, è comunque necessario emettere la chiamata UPDATE appropriata per modificare i record particolari bloccati.

In questo caso, basta usare lo stesso WHERE clausola nel UPDATE, per esempio:

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

Ciao, voglio bloccare la tabella, si può vedere la mia domanda precedente? http://stackoverflow.com/questions/14707002/lock-table-in-postgresql#comment20571089_14707002 –

+0

Darei un'occhiata, ma contrassegnare questa risposta come accettata se risolve il problema. –

+1

Nota che sta utilizzando un LIMIT 1 per FOR UPDATE, questo generalmente significa che la sua clausola where può restituire più di 1 record. Ora, dato che non ho il suo DDL per il tavolo, dovrebbe usare qualunque sia la sua chiave primaria per fare l'aggiornamento, se è idvideo, allora dovrebbe usare UPDATE video SET scheduleflag = true WHERE idvideo = ?. Il motivo è che anche se usa la stessa query (ORDER BY/LIMIT), potrebbe ANCORA aggiornare un record diverso (potrebbe essere inserito un nuovo ID prima di esso) – Rahly

Problemi correlati