为每一行从子查询中更新值


update users set first_name = (select firstname from temp_names order by random() limit 1),
last_name = (select lastname from temp_names order by random() limit 1)

应该从temp_names文件夹中获得一个随机行,即使它得到了,但是对于它更新的每一行重复,用户中的所有行都具有相同的first_name值和相同的last_name值。

我如何使它为每一行运行子查询?

问题是Postgres决定通过优化子查询并只运行一次来帮助您。虽然Postgres不是唯一这样做的数据库,但我认为这是一个错误,因为子查询依赖于一个volatile函数。优化改变了代码的含义。

我发现一个关联子句——几乎任何类型的——外部查询解决了这个问题。例如,如果您有一个非NULLid列:

update users u
set first_name = (select firstname from temp_names tn where u.id is not null order by random() limit 1),
last_name = (select lastname from temp_names where u.id is not null order by random() limit 1);

这是一个db<>小提琴

最新更新