PostgreSQLでUPDATE FROM構文を使って複数の行を更新する方法
PostgreSQLで同じクエリで複数の行を更新する方法
WHERE句を使用する
これは、特定の条件に一致する行を更新する最も一般的な方法です。
UPDATE テーブル名
SET 列名1 = 新しい値1, 列名2 = 新しい値2
WHERE 条件式;
例えば、users
テーブルのage
列を20歳以上の人に全て30に更新するには、次のようなクエリを使用します。
UPDATE users
SET age = 30
WHERE age >= 20;
UPDATE FROM構文を使用する
この構文は、別のテーブルからデータを取得して、そのデータに基づいて行を更新するために使用できます。
UPDATE テーブル名
SET 列名1 = t.列名1, 列名2 = t.列名2
FROM 別テーブル名 AS t
WHERE テーブル名.条件式 = t.条件式;
例えば、users
テーブルのaddress
列をaddresses
テーブルのaddress
列に基づいて更新するには、次のようなクエリを使用します。
UPDATE users
SET address = a.address
FROM addresses AS a
WHERE users.id = a.user_id;
RETURNING句を使用する
この句は、UPDATEクエリによって更新された行を取得するために使用できます。
UPDATE テーブル名
SET 列名1 = 新しい値1, 列名2 = 新しい値2
WHERE 条件式
RETURNING *;
例えば、users
テーブルのname
列をJohn
に更新し、更新された行を取得するには、次のようなクエリを使用します。
UPDATE users
SET name = 'John'
WHERE id = 1
RETURNING *;
このクエリは、更新された行を表す1つの行を含む結果セットを返します。
-- usersテーブルのage列を20歳以上の人に全て30に更新
UPDATE users
SET age = 30
WHERE age >= 20;
-- usersテーブルのaddress列をaddressesテーブルのaddress列に基づいて更新
UPDATE users
SET address = a.address
FROM addresses AS a
WHERE users.id = a.user_id;
-- usersテーブルのname列をJohnに更新し、更新された行を取得
UPDATE users
SET name = 'John'
WHERE id = 1
RETURNING *;
CASE式を使用する
CASE
式を使用して、条件に基づいて異なる値を列に割り当てることができます。
UPDATE テーブル名
SET 列名 = CASE
WHEN 条件1 THEN 新しい値1
WHEN 条件2 THEN 新しい値2
ELSE 新しい値3
END
WHERE 条件式;
例えば、users
テーブルのage
列を、20歳未満の場合は10、20歳以上30歳未満の場合は20、30歳以上の人は30に更新するには、次のようなクエリを使用します。
UPDATE users
SET age = CASE
WHEN age < 20 THEN 10
WHEN age < 30 THEN 20
ELSE 30
END
WHERE age IS NOT NULL;
PL/pgSQLを使用する
PL/pgSQL
を使用して、より複雑な更新処理を実行できます。
CREATE FUNCTION update_users()
RETURNS void AS
$$
BEGIN
UPDATE users
SET age = age + 1;
END;
$$ LANGUAGE plpgsql;
SELECT update_users();
この例では、update_users
という名前の関数を作成し、その関数を使用してusers
テーブルのage
列を1ずつ増やしています。
COPYコマンドを使用する
COPY
コマンドを使用して、ファイルからデータをテーブルに読み込み、そのデータを基づいて行を更新できます。
COPY users (name, age)
FROM '/path/to/file.csv'
DELIMITER ','
CSV;
sql postgresql