带有WHERE子句的Bulk UPDATE表是可变的

时间:2015-05-13 01:28:49

标签: python sql postgresql sql-update

我有一堆价值[(foo1, bar1), (foo2, bar2), ...],我想做一些更新"设置' foo'列到' foo1'那里的酒吧'列是' bar1'"。

我使用psycopg2在Python中执行此操作。我可以使用查询executemany执行UPDATE table SET foo = %s WHERE bar = %s,但这需要进行大量的更新,并且会花费很长时间。

我怎样才能轻松快速地完成这项工作?也许有临时表的东西?

Postgres版本9.3。

1 个答案:

答案 0 :(得分:1)

UPDATE tbl t 
SET    foo = v.foo
FROM  (
   VALUES ('foo1'::text, 'bar1'::text), ('foo2', 'bar2'), ...
   ) v(foo, bar)
WHERE t.bar = v.bar;

只有值表达式的第一行才需要显式类型转换。示例中的text可以是任何东西。后续行中的字符串文字被强制转换为相同的类型。

根据您拥有键值对的形式,其他方法可能更方便。比如:创建一个临时表COPY,然后使用UPDATE中的临时表,就像任何其他表一样。详细说明:

你可以并行传递两个简单的数组和不需要的东西(Postgres 9.3的语法):

UPDATE tbl t 
SET    foo = v.foo
FROM  (
   SELECT unnest('{foo1,foo2,...}'::text[]) AS foo
        , unnest('{bar1,bar2,...}'::text[]) AS bar
   ) v(foo, bar)
WHERE t.bar = v.bar;

Postgres 9.4有更好的方法: