今回やること
この記事では、学習用テーブルで UPDATE と DELETE を実行し、BEGIN、COMMIT、ROLLBACK の流れを確認します。
変更系SQLは、対象確認、トランザクション、結果確認をセットで練習します。
前提条件
- SQLを実行できる環境がある
- 学習用の空データベースで試す
- 本番データや重要データには実行しない
Step 1: 練習用テーブルを作る
CREATE TABLE tasks (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL,
done BOOLEAN NOT NULL DEFAULT false
);
Step 2: データを入れる
INSERT INTO tasks (id, title, done) VALUES
(1, 'SQLを読む', false),
(2, 'WHEREを練習する', false),
(3, 'JOINを練習する', false);
確認します。
SELECT *
FROM tasks
ORDER BY id;
Step 3: 更新対象をSELECTで確認する
id = 1 のタスクを完了にします。まず対象を確認します。
SELECT *
FROM tasks
WHERE id = 1;
ここで1件だけ表示されることを確認します。
Step 4: トランザクション内でUPDATEする
BEGIN;
UPDATE tasks
SET done = true
WHERE id = 1;
SELECT *
FROM tasks
WHERE id = 1;
まだ COMMIT していません。結果を見て問題ないか確認します。
Step 5: 取り消してみる
まずは練習として取り消します。
ROLLBACK;
取り消されたか確認します。
SELECT *
FROM tasks
WHERE id = 1;
done が false に戻っていれば、ROLLBACK を体験できています。
Step 6: 今度はCOMMITする
BEGIN;
UPDATE tasks
SET done = true
WHERE id = 1;
COMMIT;
確定後に確認します。
SELECT *
FROM tasks
WHERE id = 1;
COMMITすると、そのトランザクションの変更は確定します。
Step 7: DELETEも同じ流れで確認する
削除前に対象を確認します。
SELECT *
FROM tasks
WHERE id = 3;
トランザクション内で削除します。
BEGIN;
DELETE FROM tasks
WHERE id = 3;
SELECT *
FROM tasks
ORDER BY id;
ROLLBACK;
ここでは ROLLBACK して、削除を取り消します。
Step 8: WHEREなしの危険を理解する
次のSQLは実行しないでください。
DELETE FROM tasks;
WHERE がないため、全行削除になります。練習でも、危険な形を見たらすぐに違和感を持つことが大切です。
よくあるエラー
| エラー | よくある原因 | 確認すること |
|---|---|---|
ROLLBACK できない | すでに COMMIT した | COMMIT後は基本的に戻せません |
| 全行更新された | WHERE を忘れた | 実行前にSELECT確認する |
| 更新されない | 条件に合う行がない | SELECT で対象件数を確認 |
| 接続先が違う | 別DBにつないでいる | データベース名を確認する |
まとめ
UPDATE と DELETE は、実行前に同じ条件で SELECT して対象を確認します。不安な操作は BEGIN で始め、結果を確認してから COMMIT します。取り消す場合は ROLLBACK です。