假设我有一个名为
然而,在
此外,我不确定当并发查询运行时它会如何表现。如果我们同时更新这两行,它们是否可能返回相同的
有没有更优雅的解决方案?也许是一些窗口/聚合函数?
t
的表,它在Postgres中: id | group_name | state
-----------------------------
1 | group1 | 0
2 | group1 | 0
3 | group1 | 0
我需要通过ID更新一行的state
,同时返回以下内容:
- 旧状态
- 与该行处于同一组且
state
= 0的剩余行数
我有一个如下的查询语句可以实现这个功能:
UPDATE t AS updated SET state = 1
FROM t as original
WHERE
updated.id = original.id AND
updated.id = :some_id
RETURNING
updated.state AS new_state,
original.state AS old_state,
(
SELECT COUNT(*) FROM t
WHERE
group_name = updated.group_name AND
state = 0
) as remaining_count;
然而,在
RETURNING
中的子查询似乎是在更新完成之前执行的,导致我得到了一个偏差为1的remaining_count
。此外,我不确定当并发查询运行时它会如何表现。如果我们同时更新这两行,它们是否可能返回相同的
remaining_count
?有没有更优雅的解决方案?也许是一些窗口/聚合函数?