Postgres:SELECT 语句的更新和 return 结果

Postgres: UPDATE and return result of SELECT statement

我的 table 可能是这样的:

created last_read data
2021-10-15 15:51:50 NULL BINARY
2021-10-14 12:22:13 NULL BINARY
2021-10-13 06:32:44 2021-10-14 16:44:08 BINARY
2021-10-12 16:05:07 2021-10-13 17:21:09 BINARY

我想做什么: SELECT x 行按创建的 ASC 和 last_read ASC 排序,并设置时间 last_read select 将行编辑到 NOW()

SELECT 看起来像这样:

SELECT data
FROM my_table
ORDER BY last_read NULLS FIRST, created
LIMIT 3

然后我将获取结果集并应用以下 UPDATE 语句:

UPDATE my_table
SET last_read = NOW()

问题: 执行上述 returns returns 结果的查询看起来如何=47=]?

如果返回的数据在UPDATE之前或之前都没有关系,因为我只有select数据列。

我试过了

UPDATE my_table
SET last_read = NOW()
RETURNING data

但是,我无法为此提供 ORDER BY 和 LIMIT。因此,它不会产生预期的结果,但会更新 returns 所有行。

我可能还会想到使用子查询来更新基于SELECT 的行。但是这些行将不会作为结果返回。

WITH cte AS (
  SELECT *
  FROM mytable
  ORDER BY last_read NULLS FIRST, created
  LIMIT 3
)
UPDATE mytable t
SET last_read = NOW()
FROM cte
WHERE cte.created = t.created
RETURNING t.data; 

db<>fiddle