如何大规模更新?

时间:2014-09-02 23:01:33

标签: sql postgresql

我有三张桌子:

group:
  id - primary key
  name - varchar

profile:
    id - primary key
    name - varchar
    surname - varchar
    [...etc...]

profile_group:
    profile_id - integer, foreign key to table profile
    group_id - integer, foreign key to table group

个人资料可能在很多群组中。我有一个名为“Users”的组,其id = 1,我想将所有用户分配给该组,但前提是表格配置文件没有这样的条目。

怎么做?

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望将( profile_id ,1)等条目添加到profile_group表中,以用于之前不在此表中的所有配置文件。如果是这样,试试这个:

INSERT INTO profile_group(profile_id, group_id) 
     SELECT id, 1 FROM profile p 
     LEFT JOIN profile_group pg on (p.id=pg.profile_id) 
     WHERE pg.group_id IS NULL;

答案 1 :(得分:0)

您要做的是使用左连接到配置文件组表,然后排除任何匹配的记录(这在以下SQL语句的where子句中完成)。

这比使用not in (select xxx)更快,因为查询分析器似乎更好地处理它(根据我的经验)

insert into profile_group (profile_id, group_id)
select p.id, 1
from profiles p
left join profile_group pg on p.id = pg.profile_id 
    and pg.group_id = 1
where pg.profile_id is null