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_id | first_name | last_name | salary |
|---|---|---|---|
| 1 | John | Doe | 50000 |
| 2 | Jane | Smith | 60000 |
| 3 | Peter | Jones | 55000 |
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.05 は salary + (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_id | manager_id |
|---|---|
| 1 | 2 |
ここで、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_id | department_name | bonus_percentage (ボーナス比率) |
|---|---|---|
| 1 | Sales | 0.05 |
| 2 | Marketing | 0.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)し、各従業員に対して所属部門に応じた適切なボーナス比率を動的に適用しています。