#04 MySQLデータベースを使ってみよう
データを更新・削除する — UPDATE と DELETE
データの更新と削除
データベース操作では、既存のデータを変更したり、不要になったデータを削除することも必須です。今回は UPDATE文? テーブルの既存データを更新するSQL文。`UPDATE users SET name='次郎' WHERE id=1` のように変更する列と条件を指定する。WHERE を忘れると全行が更新されるので注意。 と DELETE文? テーブルから行を削除するSQL文。`DELETE FROM users WHERE id=1` のように条件を指定する。WHERE を省略すると全行削除になるので注意。 を学びます。これらは強力な命令ですが、使い方を誤るとデータを大量に失う危険があります。注意点も含めてしっかり理解しましょう。
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 を忘れた場合の危険性
UPDATE と DELETE において WHERE を省略すると全件が対象 になります。これは実務では最も避けるべきミスのひとつです。
-- ⚠️ 危険: WHERE がないと全ユーザーのメールが変わる!
UPDATE users SET email = 'test@example.com';
-- ⚠️ 危険: WHERE がないと全ユーザーが削除される!
DELETE FROM users;
予防策
- まず SELECT で確認してから実行する
-- ① まずSELECTで対象を確認
SELECT * FROM users WHERE is_active = FALSE;
-- ② 意図通りならDELETE実行
DELETE FROM users WHERE is_active = FALSE;
- MySQLの
--safe-updatesモードを使う
# safe-updatesモードで接続(WHERE/LIMIT必須になる)
mysql --safe-updates -u root -p
TRUNCATE TABLE — テーブルを空にする
DELETE と似ていますが、TRUNCATE はテーブルの全データを一括削除します。
-- テーブルを空にする
TRUNCATE TABLE users;
DELETE と TRUNCATE の違い
| 比較項目 | DELETE | TRUNCATE |
|---|---|---|
| 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 TRANSACTION→COMMIT/ROLLBACK)で安全に操作できる
次回は WHERE 句をさらに深掘りし、様々な絞り込み条件の書き方を学びます。