postgres选择更新查询含义

时间:2018-03-19 06:36:53

标签: postgresql

以下查询在postgres中的含义是什么?我知道这是关于锁定的事情,但有人可以取悦。

select col1, col2 from table where col1=123 for update;

其实我有一张像

这样的表格
id  col1  col2  receipt_id  receipt_year
1   ddd   ggg   1           2018
2   ddd   eee   2           2018

我需要每年将receipt_id重置为1.即1 / 2017,1 / 201,等等。 我正在使用查询

select max(receipt_id) from table where receipt_year=$current_year;

然后如果找到id,我向它添加1,否则我将其设置为1.

这是正确的方法吗?

id  col1  col2  receipt_id  receipt_year
1   ddd   ggg   1           2018
2   ddd   eee   2           2018

2019年:

id  col1  col2  receipt_id  receipt_year
1   ddd   ggg   1           2018
2   ddd   eee   2           2018
3   lol   lpl   1           2019 

目前我这样做:

$current_year = date('Y');
$sql = SELECT MAX(receipt_id) AS receipt_id FROM table WHERE receipt_year=:year;
$stmt = $conn->prepare($sql);
$stmt->execute(array(':year' => $current_year));
$receipt_ido = $stmt->fetchColumn();

if ( ! empty($receipt_ido)) {
   $receipt_id = ($receipt_ido + 1);
} else {
   $receipt_id = 1;
}

1 个答案:

答案 0 :(得分:1)

documentation非常清楚FOR UPDATE子句的作用:

  

FOR UPDATE会导致SELECT语句检索到的行被锁定,就像更新一样。这可以防止其他事务修改或删除它们,直到当前事务结束。也就是说,在当前事务结束之前,将阻止尝试UPDATE,DELETE或SELECT FOR UPDATE这些行的其他事务。

此外,FOR UPDATE将等待另一个对记录具有更新锁定的事务在开始之前完成。

使用简洁的语言,标记到FOR UPDATE末尾的SELECT可确保完成选择,而不会在选择的同时进行任何更新。这意味着您的选择将返回数据的准确快照,而无法从记录中获取中间数据。