如何从 PostgreSQL 中的另一个表中更新具有随机 id 的表
Posted
技术标签:
【中文标题】如何从 PostgreSQL 中的另一个表中更新具有随机 id 的表【英文标题】:How can I update a table with random ids from another table in PostgreSQL 【发布时间】:2021-04-23 11:38:59 【问题描述】:我有一个包含一百万条记录的成员表。主键是 id。此表中的一列是 master_location_id,它指的是 master_location 表中的 id 列,它有 41481 条记录。成员表中的 master_location_id 尚未填充。我正在使用匿名块填充它。它将从成员表中获取所有记录,然后循环,从 master_location 获取随机记录(从 master_location order by random() limit 1 中选择 id),然后更新成员表。但它的效率非常低。是否可以使用 SQL 语句执行此操作? PostgreSQL 版本是 13.2。
【问题讨论】:
***.com/questions/8674718/… 【参考方案1】:您可以使用row_number()
。假设主位置比成员多,您可以使用:
update members m
set master_location_id = ml.id
from (select m.*, row_number() over (order by id) as seqnum
from members m
) mm join
(select ml.*, row_number() over (order by random()) as seqnum
from master_locations ml
) ml
on ml.seqnum = mm.seqnum
where mm.id = m.id;
请注意,更新一百万行需要一些时间。
此外,如果位置数少于成员数,则可以轻松调整这一点——对JOIN
条件使用模运算。这将是对查询的调整。
编辑:
分配多个位置的调整是:
update members m
set master_location_id = ml.id
from (select m.*, row_number() over (order by id) as seqnum
from members m
) mm join
(select ml.*,
row_number() over (order by random()) as seqnum,
count(*) over () as cnt
from master_locations ml
) ml
on ml.seqnum = mm.seqnum % ml.cnt
where mm.id = m.id;
【讨论】:
有 100 万会员,41481 个地点(美国邮政编码) 我猜设置 m.master_location_id = ml.id 应该设置 master_location_id = ml.id @Jayadevan 。 . .我修好了。以上是关于如何从 PostgreSQL 中的另一个表中更新具有随机 id 的表的主要内容,如果未能解决你的问题,请参考以下文章
如何从数据库表中获取数据并将该数据更新到休眠中的另一个表中?我已经在 JSP 中完成了,但我想在 Hibernate 中完成