2013-02-05 12 views
5

テーブルのレコードのフィールドを選択し、これらのフィールドの1つだけを更新したいとします。どのようにできるのか?PostgreSQLのUpdateステートメントを選択

私はこれを試してみてください。

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; 

しかし、この方法では、すべてのレコードのフィールド「schedulingflag」真が設定されます!

答えて

12

SELECT FOR UPDATEの構文では、これらのレコードを更新することをPGに指示し、それらのレコードを同時アクセスからロックします。ただし、ロックした特定のレコードを変更するには、適切なUPDATEコールを発行する必要があります。この場合

、ちょうど例えば、あなたのUPDATEに同じWHERE句を使用します。

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

こんにちは、私はテーブルをロックしたい、あなたは私の前の質問を見ることができますか? http://stackoverflow.com/questions/14707002/lock-table-in-postgresql#comment20571089_14707002 –

+0

私は一見しますが、あなたの問題を解決する場合は、この回答に同意してください。 –

+1

彼はFOR UPDATEにLIMIT 1を使用していることに注意してください。これは、通常、where句が1つ以上のレコードを返す可能性があることを意味します。さて、私はテーブルのための彼のDDLを持っていないので、彼はプライマリキーが何であれ、idvideoの場合は、UPDATEビデオSETを使用する必要がありますを使用する必要がありますSET SET FLAG = true WHERE idvideo =?その理由は、彼が同じクエリ(ORDER BY/LIMIT)を使用しても、別のレコードをまだ更新することができるからです(新しいIDがその前に挿入される可能性があります) – Rahly

関連する問題