【SQL】UPDATE文でデータを更新する

SQL

こんにちは、かつコーチです。

前回の記事では、テーブルに新しいデータを追加するINSERT文を解説しました。

今回は、すでに登録されているデータの内容を書き換えるUPDATE文を扱います。

会員情報の変更、注文ステータスの更新など、Webアプリでは新規追加と同じくらいUPDATEも頻繁に使われます。
正しく使わないとデータを壊してしまう危険もあるため、注意点まで含めてしっかり押さえていきましょう。

UPDATE文とは?

既存の行を書き換えるSQL文

UPDATE文とは、テーブルにすでに存在する行の値を書き換えるためのSQL文です。
前回解説したINSERT文と同じくDML(データ操作言語)に分類されます。

この記事では、以下のテーブルを使います。

CREATE TABLE customers (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL,
    prefecture VARCHAR(20),
    status VARCHAR(20) DEFAULT 'active'
);

なぜUPDATE文が必要なのか

会員が引っ越して住所(都道府県)が変わった、メールアドレスを変更した、退会処理でステータスを切り替えたい。
こうした「すでにあるデータの一部だけを書き換えたい」場面では、行を丸ごと削除して作り直すのではなく、UPDATE文でピンポイントに値を更新します。

基本の書き方

手順1:WHEREで対象を絞ってUPDATEする

もっとも基本的な書き方は、WHERE句で対象の行を特定し、SET句で新しい値を指定する形です。

UPDATE customers
SET prefecture = '大阪府'
WHERE id = 1;

これで、idが1の顧客のprefectureだけが「大阪府」に書き換わります。
他の顧客のデータや、他のカラムの値には影響しません。

手順2:複数カラムを同時に更新する

SET句はカンマ区切りで複数のカラムを同時に指定できます。

UPDATE customers
SET email = 'tanaka-new@example.com', prefecture = '東京都'
WHERE id = 1;

1回のUPDATE文で複数のカラムをまとめて書き換えられるため、カラムごとに何度もUPDATE文を実行する必要はありません。

手順3:複数行をまとめて更新する

WHERE句の条件に複数行が該当する場合、その全ての行がまとめて更新されます。

UPDATE customers
SET status = 'inactive'
WHERE prefecture = '沖縄県';

これは「沖縄県の顧客全員のステータスを一括で変更する」という処理です。
条件に該当する行数に関わらず、1回のUPDATE文で完結する点がUPDATE文の便利さです。

よくあるつまずきポイント・エラー対処

WHERE句を書き忘れて全件更新してしまう

❌ Before:WHERE句を書き忘れ、テーブル全体を書き換えてしまう

UPDATE customers
SET status = 'inactive';

これは私が実務で実際に経験した、最も冷や汗をかいたミスです。
本来は「特定の顧客だけステータスを変更する」つもりで書いていたUPDATE文から、WHERE句を書き忘れたまま実行してしまい、テーブル内の全顧客のステータスがinactiveに上書きされてしまいました。
幸い直前にバックアップを取っていたため復旧できましたが、WHERE句のないUPDATE文は「その時点の全行」を対象にするという恐ろしさを痛感した出来事でした。

✅ After:実行前にSELECT文で対象行を確認してからUPDATEする

-- まずSELECTで対象を確認する
SELECT id, name, status FROM customers WHERE id = 5;

-- 対象が正しいことを確認してからUPDATEに切り替える
UPDATE customers
SET status = 'inactive'
WHERE id = 5;

UPDATE文を書く際は、必ず同じWHERE条件でSELECT文を先に実行し、「更新される行が想定通りか」を目で確認してからUPDATE文に切り替える習慣をつけることを強くおすすめします。
特に本番環境でUPDATE文を実行する際は、このワンクッションを省略しないようにしてください。

更新後の値が想定と違う

❌ Before:文字列と数値の比較で意図しない行まで更新されてしまう

UPDATE customers
SET status = 'vip'
WHERE id = '1';

idがINT型のカラムに対して文字列の'1'で比較しています。
MySQLでは暗黙的な型変換が行われるため、多くの場合エラーにはなりませんが、意図せず型変換に頼った書き方になっており、他のDBMSでは同様の挙動が保証されません。

✅ After:カラムの型に合わせた値で条件を指定する

UPDATE customers
SET status = 'vip'
WHERE id = 1;

条件に指定する値の型は、カラムの型と一致させることを基本にしましょう。

応用・一歩先の使い方

現在の値を使って更新する

UPDATE文では、SET句の右辺に現在のカラムの値を使った計算式を書くこともできます。

UPDATE products
SET stock = stock - 1
WHERE id = 10;

これは「在庫を1つ減らす」という処理で、注文確定時などによく使われる書き方です。
現在の値を基準に相対的な更新ができるのが、UPDATE文の便利なところです。

JOINを使って他テーブルの値を参照して更新する

MySQLでは、UPDATE文でJOINを使い、他テーブルの値を参照しながら更新することができます。

UPDATE customers c
INNER JOIN orders o ON c.id = o.customer_id
SET c.status = 'vip'
WHERE o.amount >= 100000;

これは「10万円以上の注文をした顧客のステータスをVIPに変更する」という処理です。
customersテーブル単体では判断できない条件を、ordersテーブルと結合することで実現しています。

まとめ

この記事のポイント

  • UPDATE文は既存の行の値を書き換えるDML(データ操作言語)の一つ
  • WHERE句を書き忘れると、テーブル全体が更新されてしまう
  • 実行前に同じ条件でSELECT文を実行し、対象行を確認する習慣が事故を防ぐ
  • SET句では現在の値を使った計算式や、JOINを使った更新もできる

次に読むべき記事

データの更新ができたら、次は不要になったデータを削除する「DELETE文でデータを削除する」に進んでください。

タグ: SQL, 初心者向け, DML

タイトルとURLをコピーしました