PostgreSQL 入門

PostgreSQL におけるデータの更新(UPDATE)

データベース管理において、テーブル内のデータを更新する操作は極めて重要です。UPDATE文を使用することで、テーブルに存在する既存の古いデータを修正し、データベースが常に最新の情報を正確に反映している状態を維持できます。

データ整合性(Integrity)を保ちながら、効率的かつ安全にUPDATE文を使いこなすことは、データベースの鮮度を保つための必須スキルです。

1. UPDATE文:基本構文

PostgreSQLにおけるUPDATE文の基本構文は以下の通りです。

UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;

このステートメントの各構成要素を詳しく見ていきましょう:

  • UPDATE table_name: データを修正したい対象のテーブル名(Table Name)を指定します。
  • SET column1 = value1, ...: 更新したいカラム(Column)と、そこに代入する新しい値(Value)を定義します。カンマで区切ることで、1つのUPDATE文で複数のカラムを同時に更新できます。
  • WHERE condition: これはUPDATE文において最も重要かつ注意が必要な部分です。更新対象となる行(Row)を指定します。もしWHERE句を省略すると、テーブル内のすべての行が更新されてしまいます! これは通常、意図しない重大なミスにつながります。

基本例:

次のような employees(従業員)テーブルがあると仮定します。

employee_idfirst_namelast_namesalary
1JohnDoe50000
2JaneSmith60000
3PeterJones55000

John Doe の給与(salary)を 52000 に更新する場合、以下のUPDATE文を使用します。

UPDATE employees
SET salary = 52000
WHERE employee_id = 1;

このクエリを実行すると、employees テーブルの ID が 1 である行の給与が 52000 に変更されます。

2. 複数のカラムを同時に更新する

UPDATE文では、複数のカラムを一括で修正することが可能です。SET句の中に「カラム = 値」のペアを複数含め、それぞれをカンマで区切ります。

例:

Jane Smith が結婚して姓が Williams に変わり、同時に昇給して給与が 65000 になったとします。1つのステートメントで彼女の姓と給与を同時に更新できます。

UPDATE employees
SET last_name = 'Williams', salary = 65000
WHERE employee_id = 2;

3. SET句で算術式を使用する

SET句の中では、既存のデータをベースにした算術式(Mathematical Expressions)を使用して、新しい値を計算することができます。これにより、複雑な一括調整が可能になります。

例:

会社が ID 3 の従業員(Peter Jones)の給与を 5% 引き上げることに決定したとします。式を使って新しい給与を計算できます。

UPDATE employees
SET salary = salary * 1.05
WHERE employee_id = 3;

ここで salary * 1.05salary + (salary * 0.05) と書くこともできます。)

危険警告: もし誤って UPDATE employees SET salary = salary * 1.05; と(WHERE句なしで)記述してしまうと、全従業員の給与が一瞬にして 5% 上昇してしまいます!

4. 複雑なWHERE条件を組み合わせた更新

WHERE句では、論理演算子(AND, OR, NOT)や比較演算子(=, !=, >, <, >=, <=)を組み合わせて、複雑なフィルタリング(Filtering)条件を構築できます。これにより、特定のターゲット行を正確に特定できます。

例:

現在給与が 60000 未満のすべての従業員に対して、一律 10% の昇給を適用する場合:

UPDATE employees
SET salary = salary * 1.10
WHERE salary < 60000;

この例では、元々の給与が 52000 の John と 55000 の Peter は昇給対象となりますが、すでに 65000 に達している Jane は影響を受けません。

5. 応用:他テーブルのデータを使用した更新

場合によっては、別のテーブルにある情報に基づいて、現在のテーブルのデータを更新する必要があります。これは通常、サブクエリ(Subqueries)やテーブルの関連付けによって実現します。

5.1 サブクエリ(Subqueries)による更新

マネージャーが誰であるかを記録している department_managers(部門マネージャー)テーブルがあるとします。

department_idmanager_id
12

ここで、employees テーブルにブーリアン(Boolean)型のカラム is_manager を追加し、マネージャーである従業員にフラグを立てたいとします。

まず、カラムを追加したと仮定します:

ALTER TABLE employees ADD COLUMN is_manager BOOLEAN DEFAULT FALSE;

次に、サブクエリを使用して更新します:

UPDATE employees
SET is_manager = TRUE
WHERE employee_id IN (SELECT manager_id FROM department_managers);

このステートメントは、department_managers テーブルにあるすべてのマネージャー ID を検索し、employees テーブルの対応する従業員の is_manager フィールドを TRUE に設定します。

5.2 他テーブルとの結合(FROM句)による更新

PostgreSQLでは、別のテーブルのデータに基づいてターゲットテーブルを更新する場合、標準的なSQLのJOIN構文ではなく、FROM句WHERE条件によるマッチングを使用するのが一般的です。

departments(部門)テーブルがあるとします。

department_iddepartment_namebonus_percentage (ボーナス比率)
1Sales0.05
2Marketing0.10

employees テーブルにはすでに department_id カラムがあり、各従業員が所属する部門が紐付けられているとします。各部門のボーナス比率に基づいて、給与を更新(ボーナスを加算)したい場合のクエリは以下の通りです。

PostgreSQLにおける推奨構文:

UPDATE employees
SET salary = employees.salary * (1 + departments.bonus_percentage)
FROM departments
WHERE employees.department_id = departments.department_id;

このクエリでは、PostgreSQLが WHERE 句内の department_id を介して employees テーブルと departments テーブルを結合(JOIN)し、各従業員に対して所属部門に応じた適切なボーナス比率を動的に適用しています。