我有一堆价值[(foo1, bar1), (foo2, bar2), ...]
,我想做一些更新"设置' foo'列到' foo1'那里的酒吧'列是' bar1'"。
我使用psycopg2在Python中执行此操作。我可以使用查询executemany
执行UPDATE table SET foo = %s WHERE bar = %s
,但这需要进行大量的更新,并且会花费很长时间。
我怎样才能轻松快速地完成这项工作?也许有临时表的东西?
Postgres版本9.3。
答案 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有更好的方法: