2015-09-25 35 views
-1

我有两个表中的Postgres:SQL更新基础上的所有字段加入型号

Sources [id, term, type] 
Posts [id, source_id, message, term, type] 

我去正火这个数据,所以我加入期限和类型的列到每个帖子,并摆脱Sources表。

有没有办法做一个FAST查询,更新帖子与他们各自的源数据(有大约800万个帖子)。

喜欢的东西:

UPDATE posts 
JOIN sources 
ON posts.source_id = sources.id 
SET post.term = sources.term, 
    posts.term_type = sources.term_type; 

但是,抛出一个语法错误我。

+1

我想你错过了你改变'posts'结构的部分?因为你的'post'定义没有'term'或'term_type'字段。和'源'不存在于任何表 –

+0

@JuanCarlosOropeza true!我已更新。 – goddamnyouryan

+0

好我更新我的答案:) –

回答

2

Postgres里正确的语法是:

UPDATE posts 
    SET posts.source = sources.source, 
     post.term = sources.term, 
     posts.term_type = sources.term_type 
    FROM sources 
    WHERE posts.source_id = sources.id; 

或者,你可以使用一个行构造函数:

UPDATE posts 
    SET (source, term, term_type) = (select s.source, s.term, s.term_type 
            from source s 
            where posts.source_id = s.id 
            ); 
+0

优秀!其中哪一个会更快? – goddamnyouryan

+0

@goddamnyouryan。 。 。我想象的表现会是相似的。如果不止一行匹配,第二个会返回一个错误(这可能是一件好事)。 –

1

Postgres里的每个更新包括一个insert和一个delete。因此,如果指数是活跃的,那么除了双重工作之外,也会有影响

如果你想更新通常整个表快得多刚刚创建的新值

CREATE TABLE post2 AS 
    SELECT p.id, p.source_id, p.message, s.term, s.term_type. 
    FROM posts p 
    INNER JOIN source s 
     ON p.source_id = s.id; 

表然后使用ALTER重命名tablename和创建正确的索引。

+0

那么旧桌子上的索引和约束呢?每次重新创建它们? – HAYMbl4

+0

@ HAYMbl4是的。重新创建以匹配旧桌子。但是我们再次谈到蓝月亮手术中的一种情况,而不是日常维护。但是,当创建表需要几秒钟时间并且更新需要花费数小时时,更好的办法是多做点工作,然后构建一个脚本来执行更新并处理创建约束索引部分。 –

+0

如果对于涉及条件的列创建'index'(在这个查询中它们是'posts.source_id'和'source.id'),更新将会很快。更新表中的'oracle'和大数据是实际的。我认为'postgrate'也 – HAYMbl4