Postgresql postgres选择更新查询含义

Postgresql postgres选择更新查询含义,postgresql,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 我需要每年将收据id重置为1。i、 e 2017年1月、20

以下查询在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
我需要每年将收据id重置为1。i、 e 2017年1月、2018年1月等。 我正在使用查询

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;
}
这使得
FOR UPDATE
子句的作用非常明确:

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

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

在更简单的语言中,
FOR UPDATE
标记在
SELECT
的末尾,确保选择将完成,而不会与选择同时发生任何更新。这意味着您的select将返回数据的准确快照,而不可能从记录中获取中间数据。

说明了
FOR UPDATE
子句的作用:

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

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


在更简单的语言中,
FOR UPDATE
标记在
SELECT
的末尾,确保选择将完成,而不会与选择同时发生任何更新。这意味着您的选择将返回数据的准确快照,而不可能从记录中获取中间数据。

编辑您的问题并向我们显示更多的样本数据行。然后,向我们展示输出应该是什么。您的语言不清楚(至少我不清楚)。请在重置
收据id
之前和之后向我们展示表格。我建议您提出一个新问题。除了我之外,没有人会看到这个帖子。请编辑您的问题并向我们展示更多的示例数据行。然后,向我们展示输出应该是什么。您的语言不清楚(至少我不清楚)。请在重置
收据id
之前和之后向我们展示表格。我建议您提出一个新问题。除了我,没有人会看到这条线。