PostgreSQL中的Select For Update语句

10

我想选择表中记录中的某些字段并只更新其中一个字段。我该怎么做?

我尝试了这个:

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”在所有记录中设置为true!

1个回答

17

SELECT FOR UPDATE 语法告诉 PG 你将会更新这些记录,并且防止并发访问。但是,你仍然需要发出相应的 UPDATE 调用来更改你锁定的特定记录。

在这种情况下,只需在你的 UPDATE 中使用相同的 WHERE 子句,例如:

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

你好,我想要锁定表格,请问你能看到我的前一个问题吗? http://stackoverflow.com/questions/14707002/lock-table-in-postgresql#comment20571089_14707002 - Emanuele Mazzoni
1
请注意,他在FOR UPDATE中使用了LIMIT 1,这通常意味着他的where子句可能会返回多个记录。现在,由于我没有他表的DDL,他应该使用任何主键来进行更新,如果是idvideo,则应使用UPDATE video SET scheduleflag=true WHERE idvideo=?。原因是即使他使用相同的查询(ORDER BY/LIMIT),他仍然可以更新不同的记录(新的id可能会在之前插入)。 - Rahly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接