2013-02-05 60 views
5

Tôi muốn chọn các trường trong bảng tính lại bảng và chỉ cập nhật một trong các trường này. Làm thế nào tôi có thể làm được?Chọn Cập nhật câu lệnh trong PostgreSql

tôi cố gắng này:

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; 

Nhưng theo cách này nó đặt trường "schedulingflag" true trong tất cả các kỷ lục!

Trả lời

12

Cú pháp SELECT FOR UPDATE cho PG biết rằng bạn sẽ cập nhật những bản ghi đó và khóa chúng lại với quyền truy cập đồng thời. Tuy nhiên, bạn vẫn cần phải thực hiện cuộc gọi UPDATE thích hợp để thay đổi các bản ghi cụ thể mà bạn đã khóa.

Trong trường hợp này, chỉ cần sử dụng cùng một WHERE điều khoản trong UPDATE của bạn, ví dụ:

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

Hi, tôi muốn để khóa bảng, bạn có thể xem câu hỏi trước đây của tôi? http://stackoverflow.com/questions/14707002/lock-table-in-postgresql#comment20571089_14707002 –

+0

Tôi sẽ xem xét, nhưng vui lòng đánh dấu câu trả lời này là được chấp nhận nếu giải quyết được sự cố của bạn. –

+1

Lưu ý rằng anh ta sử dụng LIMIT 1 cho FOR UPDATE, điều này thường có nghĩa là mệnh đề where của anh ta có thể trả về hơn 1 bản ghi. Bây giờ, kể từ khi tôi không có DDL của mình cho bảng, ông nên sử dụng bất cứ điều gì chính của ông là làm bản cập nhật, nếu idvideo của nó, sau đó ông nên sử dụng UPDATE video SET scheduleflag = true WHERE idvideo = ?. Lý do là ngay cả khi anh ta sử dụng cùng một truy vấn (ORDER BY/LIMIT), anh ta có thể STILL cập nhật một bản ghi khác (một id mới có thể được chèn vào trước nó) – Rahly

Các vấn đề liên quan