UPDATE 文でデータを更新する

UPDATE 文でデータを更新する とは

UPDATE文を使って、データベースのデータを更新する操作を学習します。本レッスンでは、UPDATE 文でデータを更新する の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

なぜ重要か

登録済みのデータを書き換える命令が UPDATE です。プロフィール編集、商品の値上げ、在庫の減算、注文ステータスを「発送済」に変える、こうした「既に存在する行の値を変える」操作は、Web アプリの裏側で 1 日に何百万回も走っています。UPDATEINSERT より少しだけ怖い命令で、書き間違えると取り返しがつかない大量更新事故を起こす可能性があります。「WHERE を付け忘れて全行が同じ値になった」は新人もベテランも 1 度は経験する事故です。だからこそ、UPDATE の書き方と「事故らないための型」を最初にちゃんと身につけることが大切です。

UPDATEINSERT と違い、すでに「正しいデータ」が入っている場所を上書きしに行きます。書き戻す前に「元の値は何か」「これから入れる値は本当に正しいか」「対象行は想定通りか」の 3 つを確認するクセを付けると、本番事故が激減します。

UPDATE で最も大切なのは WHERE です。WHERE を書き忘れた UPDATE は全行を同じ値で上書きするので、構文を覚える前に「WHERE は必須」と刻んでおきましょう。

基本構文

SQL クエリ

UPDATE users SET age = 30 WHERE id = 1;
  • SET の右辺に「新しい値」を書く
  • WHERE で「どの行を変えるか」を絞る

複数列をまとめて変えるならカンマで並べます。

SQL クエリ

UPDATE users SET name = '田中太郎', email = 'tanaka@example.com', updated_at = NOW() WHERE id = 1;

既存の値を使って計算する

SET の右辺には現在の列値も書けます。在庫の減算や値引きはこの形が定番です。

SQL クエリ

-- 在庫を 3 個減らす UPDATE products SET stock = stock - 3 WHERE id = 42; -- 全商品を 10% 値上げ UPDATE products SET price = price * 1.1;

処理の流れ

diagram (will load when visible)

UPDATE は内部的に「対象行を見つける → 値を計算する → 書き戻す」の 3 ステップで動きます。WHERE 句がないと全行が対象になります。

CASE で条件分岐の更新

複数の条件で値を変えたい時は CASE が使えます。

SQL クエリ

UPDATE products SET price = CASE WHEN category_id = 1 THEN price * 1.05 WHEN category_id = 2 THEN price * 1.10 ELSE price END;

ループや複数 UPDATE を 1 文で書けるので、行数が少ない場合は読みやすさも速さも両立できます。逆に CASE が肥大化するなら、対象行を絞った 2 つの UPDATE に分けた方が読みやすいです。

トランザクションでまとめる

複数の UPDATE が「全部成功か、全部失敗か」のどちらかであるべき場合、トランザクションで囲みます。

SQL クエリ

START TRANSACTION; UPDATE accounts SET balance = balance - 1000 WHERE id = 1; UPDATE accounts SET balance = balance + 1000 WHERE id = 2; COMMIT;

振込のような「お金を片方から引いて、もう片方に足す」処理は、片方だけ成功するとお金が消える/増える事故になります。後の章で詳しく扱いますが、UPDATE と切っても切れない概念です。

よくある事故と防ぎ方

注意 WHERE を忘れた UPDATE は全行更新ですUPDATE users SET is_premium = 0; を流すと全ユーザが無料会員に戻る、というのは伝説の本番事故ネタです。本番では「UPDATE と DELETE は必ず先に SELECT で件数を確認する」をルールにしましょう。

本番では UPDATE を流す前に、同じ WHERE を SELECT に置き換えて件数と内容を確認するクセを付けます。

SQL クエリ

-- 1. まず SELECT で対象を見る SELECT id, name, price FROM products WHERE category_id = 5; -- 2. 件数と内容が想定通りなら UPDATE を流す UPDATE products SET price = price * 1.1 WHERE category_id = 5;

もし可能なら、本番 DB に流す前にステージング (本番と同じスキーマ・データ量のコピー) で必ず先にリハーサルしましょう。1 億行のテーブルの 1% を UPDATE するつもりが、WHERE 句のミスで 90% に当たっていた、ということが見つかる場面です。

まとめ

  • UPDATE は SET と WHERE のセット
  • SET の右辺で既存列を参照すれば在庫減算や値引きが書ける
  • 複雑な条件は CASE で 1 文にまとめられる
  • 複数 UPDATE はトランザクションで「全部成功か全部失敗か」を担保する
  • WHERE 忘れは全行更新になる、本番では SELECT で確認してから UPDATE

次のレッスン

次は DELETE 文でデータを削除する です。DELETE文を使って、データベースからデータを削除する操作を学習します。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. UPDATE の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. UPDATE とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

テーブル構造

schema.sql

CREATE TABLE products ( id INT PRIMARY KEY, name VARCHAR(100) NOT NULL, price INT NOT NULL, stock INT NOT NULL, category_id INT NOT NULL ); INSERT INTO products (id, name, price, stock, category_id) VALUES (1, 'ノートPC', 100000, 10, 1), (2, 'ワイヤレスマウス', 3000, 50, 1), (3, '外付けSSD 1TB', 14000, 20, 1), (4, 'ボールペン', 150, 200, 2), (5, 'ノートB5', 200, 300, 2);

期待される出力

idnamepricestock
1ノートPC1000007
2ワイヤレスマウス300050
3外付けSSD 1TB1400020
4ボールペン165200
5ノートB5220300

ヒント

query.sql
query.sql
学習モード
コードの実行結果
データベースを初期化中...