#04 MySQLデータベースを使ってみよう

データを更新・削除する — UPDATE と DELETE

データの更新と削除

データベース操作では、既存のデータを変更したり、不要になったデータを削除することも必須です。今回は UPDATE文? テーブルの既存データを更新するSQL文。`UPDATE users SET name='次郎' WHERE id=1` のように変更する列と条件を指定する。WHERE を忘れると全行が更新されるので注意。 DELETE文? テーブルから行を削除するSQL文。`DELETE FROM users WHERE id=1` のように条件を指定する。WHERE を省略すると全行削除になるので注意。 を学びます。これらは強力な命令ですが、使い方を誤るとデータを大量に失う危険があります。注意点も含めてしっかり理解しましょう。

UPDATE / DELETE 前後のテーブル変化 UPDATE の例 実行前 id name email age 1 田中太郎 taro@old.com 28 2 佐藤花子 hanako@ex.com 34 3 鈴木一郎 ichiro@ex.com 22 UPDATE users SET email = 'taro@new.com' WHERE id = 1; 実行後 1 田中太郎 taro@new.com 28 ← 更新 2 佐藤花子 hanako@ex.com 34 DELETE の例 実行前 id name email age 1 田中太郎 taro@ex.com 28 2 佐藤花子 hanako@ex.com 34 ← 削除対象 3 鈴木一郎 ichiro@ex.com 22 DELETE FROM users WHERE id = 2; 実行後 1 田中太郎 taro@ex.com 28 3 鈴木一郎 ichiro@ex.com 22 ← id=2は消えた
図1: UPDATE/DELETE前後のテーブル変化

UPDATE — データを更新する

基本構文

UPDATE テーブル名
SET カラム1 = 値1, カラム2 = 値2, ...
WHERE 条件;

実際の例

-- id=1のユーザーのメールアドレスを変更
UPDATE users
SET email = 'taro.new@example.com'
WHERE id = 1;

-- 複数カラムを同時に更新
UPDATE users
SET name = '田中 太郎(更新)',
    age  = 29
WHERE id = 1;

演算を使った更新

-- productsテーブルの在庫を10増やす
UPDATE products
SET stock = stock + 10
WHERE id = 5;

-- 全商品の価格を10%値上げ
-- ※WHEREなしは全件対象になるので要注意
UPDATE products
SET price = price * 1.10;

DELETE — データを削除する

基本構文

DELETE FROM テーブル名
WHERE 条件;

実際の例

-- id=3のユーザーを削除
DELETE FROM users
WHERE id = 3;

-- is_active が FALSE のユーザーをまとめて削除
DELETE FROM users
WHERE is_active = FALSE;

-- 古い注文データを削除(1年以上前)
DELETE FROM orders
WHERE created_at < DATE_SUB(NOW(), INTERVAL 1 YEAR);

WHERE を忘れた場合の危険性

UPDATEDELETE において WHERE を省略すると全件が対象 になります。これは実務では最も避けるべきミスのひとつです。

WHERE 忘れの危険性 vs. 正しい使い方 危険: WHERE なし(全件対象) UPDATE users SET email = 'hacked@evil.com'; 全ユーザーのemailが書き換わる! id name email 1 田中太郎 hacked@evil.com ← 変更 2 佐藤花子 hacked@evil.com ← 変更 3 鈴木一郎 hacked@evil.com ← 変更 DELETE FROM users; -- 全件削除!元に戻せない! 安全: WHEREで対象を限定 -- ① まずSELECTで対象確認 SELECT * FROM users WHERE id = 1; -- ② 確認できたら実行 UPDATE users SET email = 'new@ex.com' WHERE id = 1; id=1 のユーザーだけ変更される id name email 1 田中太郎 new@ex.com ← 変更 2 佐藤花子 hanako@ex.com 変更なし 実行前にSELECTで対象を確認する習慣をつけよう
図2: WHERE忘れが引き起こす全件更新・全件削除の危険性
-- ⚠️ 危険: WHERE がないと全ユーザーのメールが変わる!
UPDATE users SET email = 'test@example.com';

-- ⚠️ 危険: WHERE がないと全ユーザーが削除される!
DELETE FROM users;

予防策

  1. まず SELECT で確認してから実行する
-- ① まずSELECTで対象を確認
SELECT * FROM users WHERE is_active = FALSE;

-- ② 意図通りならDELETE実行
DELETE FROM users WHERE is_active = FALSE;
  1. MySQLの --safe-updates モードを使う
# safe-updatesモードで接続(WHERE/LIMIT必須になる)
mysql --safe-updates -u root -p

TRUNCATE TABLE — テーブルを空にする

DELETE と似ていますが、TRUNCATE はテーブルの全データを一括削除します。

-- テーブルを空にする
TRUNCATE TABLE users;

DELETE と TRUNCATE の違い

比較項目DELETETRUNCATE
WHERE句使える使えない(全件のみ)
ロールバックできる(トランザクション内)できない
AUTO_INCREMENTリセットされないリセットされる
速度遅い(行単位)速い(テーブル単位)

トランザクションで保護する

トランザクション? 複数のDB操作をひとまとまりとして扱う仕組み。途中でエラーが起きたら全部元に戻す(ロールバック)ことで、データの整合性を保つ。 を使うと、複数のSQL操作をひとまとまりにして「全部成功するか、全部失敗するか」を保証できます。誤って実行してしまっても、コミット前であれば ROLLBACK で元に戻せます。

-- トランザクション開始
START TRANSACTION;

-- 操作を実行
UPDATE users
SET is_active = FALSE
WHERE id = 10;

-- 結果を確認してみる
SELECT * FROM users WHERE id = 10;

-- 問題なければ確定(コミット)
COMMIT;

-- 問題があれば取り消し(ロールバック)
-- ROLLBACK;

振込の例(原子性の重要性)

START TRANSACTION;

-- AさんからBさんへ1000円を振り込む
UPDATE accounts SET balance = balance - 1000 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 1000 WHERE user_id = 2;

-- 両方成功したらコミット
COMMIT;

どちらか一方だけ実行されると残高が合わなくなります。トランザクションにより、両方成功するか両方取り消すかを保証できます。


まとめ

  • UPDATE ... SET ... WHERE でデータを更新する
  • DELETE FROM ... WHERE でデータを削除する
  • WHERE を忘れると全件が対象になる。実行前に SELECT で確認する習慣を
  • TRUNCATE は全件削除で速いが、ロールバックできない
  • トランザクション(START TRANSACTIONCOMMIT / ROLLBACK)で安全に操作できる

次回は WHERE 句をさらに深掘りし、様々な絞り込み条件の書き方を学びます。