14

PostgreSQL 9.1 では、多くの行の多くの列を更新する必要があります。私は現在、多くの異なるUPDATEクエリでそれを行っています.それぞれが異なる行で機能します(主キーに基づいて):

UPDATE mytable SET column_a = 12, column_b = 6 WHERE id = 1;
UPDATE mytable SET column_a = 1, column_b = 45 WHERE id = 2;
UPDATE mytable SET column_a = 56, column_b = 3 WHERE id = 3;

これらのクエリを数千回実行する必要があります。

PostgreSQL の 1 つのクエリで大量の行を「一括更新」できる方法はありますか? を使用している場合はINSERT、一度に複数の行を挿入できます: ( INSERT INTO mytable (column_a, column_b) VALUES ( (12, 6), (1, 45) );)、 にそのようなものはありUPDATEますか?

何かのようなもの:

UPDATE mytable SET (id, column_a, column_b) FROM VALUES ( (1, 12, 6), (2, 1, 45), (3, 56, 3), … )

??

重要な点は、各 'VALUE' が 1 つの行のみを更新することです (に基づいてWHERE id =)。各行には、更新が必要な同じ固定数の列がありますが、各行には列ごとに異なる値があるため、機能しUPDATE mytable SET column_a = 12, column_b = 6 WHERE id IN (1, 2, 3);ません。

4

2 に答える 2

25

はい、一度に複数の行を更新できます (通常は SQL で推奨されます)。これを行うにはいくつかの方法がありますが、最も読みやすくエレガントな方法は、ID と値を持つ派生テーブルを使用することだと思います。

update mytable as m set
    column_a = c.column_a,
    column_b = c.column_b
from (values
    (1, 12, 6),
    (2, 1, 45),
    (3, 56, 3)
) as c(id, column_a, column_b)
where c.id = m.id

あまり読みにくいですが、より明白な解決策は次を使用することcaseです:

update mytable set
    column_a = case id when 1 then 12 when 2 then 1 when 3 then 56 end,
    column_b = case id when 1 then 6 when 2 then 45 when 3 then 3 end
where id in (1, 2, 3)
于 2013-09-21T20:42:09.220 に答える