PostgreSQL中如何实现查询指定行并更新同时返回SELECT结果
实现方案
以下为PostgreSQL环境下的可运行SQL(你原查询用到的NULLS FIRST、RETURNING均为PostgreSQL原生支持语法):
UPDATE my_table SET last_read = NOW() WHERE ctid IN ( SELECT ctid FROM my_table ORDER BY last_read ASC NULLS FIRST, created ASC LIMIT 3 ) RETURNING data;
说明
- 如果你使用的表有自定义主键字段(例如id),将上述SQL中的
ctid(PostgreSQL内置的行唯一标识)替换为主键字段,执行效率会更高 - 该写法为原子操作,一次请求即可完成筛选、更新、返回结果三个动作,避免了分两次执行SELECT、UPDATE可能出现的并发数据竞争问题
- 如果你的运行环境是MySQL,不支持
NULLS FIRST语法,可以将排序逻辑改写为ORDER BY ISNULL(last_read) DESC, last_read ASC, created ASC即可实现相同排序效果
内容的提问来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

