2013-03-05 37 views
0
UPDATE wlog 
    SET g_log = (SELECT glog_id 
       FROM glog_wlog 
       WHERE w_id=wlog.id limit 5) 
WHERE g_log is NULL; 

我的旧DB由映射表"glog_wlog"组成。现在我需要改变它所指的方式。上面的代码工作正常。但是极限5确实没有任何作用。我在表格中有超过一百万条记录。我不想一次性将它们全部转换。那么如何将它分解成任何给定的数字?如何为PostgreSQL做批量更新

+1

似乎子查询返回1行,因为在其他情况下,您将得到一个错误。 – revoua 2013-03-05 10:02:20

+0

使用'UPDATE ... FROM';请参阅手册中的“UPDATE”。没有LIMIT子句,但可以使用'WHERE'子句按ID的范围进行过滤。 – 2013-03-05 10:07:29

回答

2

您可以使用CTE来限制您正在查看的记录来执行此类子集。

如:

with wlog_targets as (
    select id from wlog 
    where g_log is null 
    limit 5) 
update wlog 
set 
    g_log = g.glog_id 
from wlog_targets w 
inner join glog_wlog g 
    on w.id = g.w_id 
where 
    wlog.id = w.id; 

此方法使用wlog_targets CTE提取的wlog记录处理一小部分。

如果所选的5条记录没有glog_wlog中的条目,则确实存在问题,则不会更新任何内容。此外,CTE没有排序,因此可能返回任何5条记录。