Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
UPDATE
テーブルの既存行を更新する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 列名 = 列名 + 値 | 現在の値に基づいた更新ができます。在庫数の増減などに使用します。 |
サンプルコード
-- 社員ID=5の社員の部署を更新します。 UPDATE employees SET department = '開発部' WHERE id = 5; -- 社員ID=3の社員の部署と給与を同時に更新します。 UPDATE employees SET department = '営業部', salary = 320000 WHERE id = 3; -- 全営業部社員の給与を5%増やします。 UPDATE employees SET salary = salary * 1.05 WHERE department = '営業部'; -- 退職日を今日の日付に設定します。 UPDATE employees SET retire_date = CURDATE() WHERE id = 7; -- 商品の在庫を1つ減らします。 UPDATE products SET stock = stock - 1 WHERE product_id = 42 AND stock > 0;
実行結果
-- UPDATE 実行後、更新された行数が返されます。 -- 例: 3行更新した場合 -- Query OK, 3 rows affected (0.01 sec) -- Rows matched: 3 Changed: 3 Warnings: 0
データベース別の書き方
『UPDATE ... SET ... WHERE』の基本構文は主要なデータベースで共通して使用できます。
UPDATE employees SET department = '開発部' WHERE id = 5;
現在の日付を設定する関数がデータベースによって異なります。MySQL は『CURDATE()』、PostgreSQL は『CURRENT_DATE』、Oracle は『SYSDATE』、SQL Server は『GETDATE()』、SQLite は『DATE('now')』を使用します。
-- MySQL
UPDATE employees SET retire_date = CURDATE() WHERE id = 7;
-- PostgreSQL・Oracle(標準SQL)
UPDATE employees SET retire_date = CURRENT_DATE WHERE id = 7;
-- SQL Server
UPDATE employees SET retire_date = CAST(GETDATE() AS DATE) WHERE id = 7;
-- SQLite
UPDATE employees SET retire_date = DATE('now') WHERE id = 7;
JOINを使った他テーブル参照更新の構文もデータベースによって異なります。MySQL は『UPDATE ... JOIN』、PostgreSQL は『UPDATE ... FROM』、SQL Server は『UPDATE ... FROM ... JOIN』を使用します。
-- 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トランザクション』も参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。