Postgresql更新200条随机记录

Postgresql update 200 random records

我有一个查询从我的数据库中返回 200 个随机不同的 foo。我想更新这些行的注释字段。

select distinct on (foo, random()) *
from test
order by random(), foo
limit 200
update test
notes = 'Flag'
order by random()
limit 200

我的第一个想法是在更新中使用顺序和限制,但那些在那里不起作用。 我认为的另一个选择是在更新中使用 select。

但我不太确定,这就是我来这里的原因。任何让 sql 更新 200 个不同的随机行的想法都很棒。

假设 foo 是您的主键,您可以执行 CTE 和 semi-join:

with cte as (
  select foo
  from test 
  order by random()
  limit 200
)
update test t
set notes = 'Flag'
where exists (
  select null
  from cte c
  where t.foo = c.foo
)

这对于大型数据集来说非常有效。

您也可以试试这个,它更容易遵循,但在性能方面的可扩展性较差。 200行应该没问题。

update test f1
set notes = 'Flag'
where foo in (select foo from test order by random() limit 200)

如果 foo 不是主键,则使用主键即可。如果您没有 PK,您可以使用所有列,但不能保证如果发生这种情况您只会更新 200。