UPDATE
| 対応: | SQL-92(1992) |
|---|
テーブルの既存行を更新するSQL文です。WHERE句で更新対象を絞り込まないと全行が更新されるため注意が必要です。
構文
条件に一致する行の列を更新します。
UPDATE テーブル名 SET 列名1 = 値1 WHERE 条件;
複数の列を一度に更新します。
UPDATE テーブル名 SET 列名1 = 値1, 列名2 = 値2 WHERE 条件;
現在の値を使って計算した値に更新します。
UPDATE テーブル名 SET 列名 = 列名 + 増加値 WHERE 条件;
構文一覧
| 構文 | 概要 |
|---|---|
| UPDATE テーブル名 SET 列名 = 値 | 指定した列に新しい値を設定します。WHERE句を省略すると全行が更新されます。 |
| SET 列名1 = 値1, 列名2 = 値2 | 複数列を一度に更新します。カンマで区切って列挙します。 |
| WHERE 条件 | 更新対象の行を絞り込みます。省略すると全行が対象になります。 |
| SET 列名 = 列名 + 値 | 現在の値に基づいた更新ができます。在庫数の増減などに使用します。 |
サンプルコード
以下の『employees』テーブルを例に説明します。
社員ID=3の社員の部署を更新します。
sample_update.sql
UPDATE employees SET department = '分析官' WHERE id = 3;
Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0
更新結果を確認します。
SELECT * FROM employees WHERE id = 3;
+----+------------+----------+--------+ | id | name | department | salary | +----+------------+----------+--------+ | 3 | 宜野座伸元 | 分析官 | 260000 | +----+------------+----------+--------+ 1 row in set
社員ID=2の社員の部署と給与を同時に更新します。
UPDATE employees SET department = '執行官', salary = 300000 WHERE id = 2;
Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0
更新結果を確認します。
SELECT * FROM employees WHERE id = 2;
+----+--------+------------+--------+ | id | name | department | salary | +----+--------+------------+--------+ | 2 | 常守朱 | 執行官 | 300000 | +----+--------+------------+--------+ 1 row in set
全執行官の給与を5%増やします(初期データから実行した例です)。
UPDATE employees SET salary = salary * 1.05 WHERE department = '執行官';
Query OK, 2 rows affected (0.01 sec) Rows matched: 2 Changed: 2 Warnings: 0
更新結果を確認します。初期データの執行官(狡噛慎也・征陸智己)の2名の給与が5%増えています。
SELECT * FROM employees WHERE department = '執行官';
+----+----------+------------+--------+ | id | name | department | salary | +----+----------+------------+--------+ | 1 | 狡噛慎也 | 執行官 | 304500 | | 4 | 征陸智己 | 執行官 | 325500 | +----+----------+------------+--------+ 2 rows in set
征陸智己の部署をすでに設定されている値(執行官)に再設定します(値が同じ場合は Changed: 0)。
UPDATE employees SET department = '執行官' WHERE id = 4;
Query OK, 0 rows affected (0.01 sec) Rows matched: 1 Changed: 0 Warnings: 0
更新結果を確認します。
SELECT id, name, department FROM employees WHERE id = 4;
+----+----------+------------+ | id | name | department | +----+----------+------------+ | 4 | 征陸智己 | 執行官 | +----+----------+------------+ 1 row in set
狡噛慎也の給与を1万円減らします。
UPDATE employees SET salary = salary - 10000 WHERE id = 1;
Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0
更新結果を確認します。
SELECT * FROM employees WHERE id = 1;
+----+----------+------------+--------+ | id | name | department | salary | +----+----------+------------+--------+ | 1 | 狡噛慎也 | 執行官 | 294500 | +----+----------+------------+--------+ 1 row in set
データベース別の書き方
『UPDATE ... SET ... WHERE』の基本構文は主要なデータベースで共通して使用できます。
UPDATE employees SET department = '分析官' WHERE id = 3;
現在の日付を設定する関数がデータベースによって異なります。MySQL は『CURDATE()』、PostgreSQL は『CURRENT_DATE』、SQLite は『DATE('now')』を使用します。
-- MySQL
UPDATE logs SET updated_at = CURDATE() WHERE id = 1;
-- PostgreSQL(標準SQL)
UPDATE logs SET updated_at = CURRENT_DATE WHERE id = 1;
-- SQLite
UPDATE logs SET updated_at = DATE('now') WHERE id = 1;
JOINを使った他テーブル参照更新の構文もデータベースによって異なります。MySQL は『UPDATE ... JOIN』、PostgreSQL は『UPDATE ... FROM』を使用します。
-- MySQL UPDATE employees e JOIN departments d ON e.department = d.name SET e.salary = e.salary * 1.05 WHERE d.category = '技術'; -- PostgreSQL UPDATE employees SET salary = salary * 1.05 FROM departments d WHERE employees.department = d.name AND d.category = '技術';
概要
『UPDATE』は既存データの変更に使用します。必ず『WHERE』句で更新対象を限定してから実行してください。
『WHERE』句を省略すると、テーブルの全行が更新されます。特に本番環境では実行前に『SELECT』で対象行を確認し、必要なら『BEGIN』(トランザクション)で保護してから実行することを推奨します。
複数テーブルをまたいだ更新(JOIN付きUPDATE)もMySQLでは可能です。たとえば別テーブルの値を参照して更新する場合などに利用できます。トランザクションについては『PDOトランザクション』も参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。