概要
このチートシートでは、データを壊す可能性があるSQL操作と、実行前の確認項目をまとめます。
変更・削除・構造変更のSQLは、実行前に接続先、対象、件数、戻し方を確認します。
最初に確認する4点
| 確認 | 内容 |
|---|---|
| 接続先 | 本番DBではないか、対象DBは正しいか |
| 対象 | どのテーブル・どの行に影響するか |
| 件数 | 何件変わるか |
| 戻し方 | ROLLBACK、バックアップ、復旧手順があるか |
危険度の高いSQL
| SQL | 危険な理由 | 実行前にすること |
|---|---|---|
UPDATE | 多数の行を書き換える | 同じWHEREでSELECT |
DELETE | 行を削除する | 対象件数をCOUNT |
TRUNCATE | 全行を高速削除する | バックアップ確認 |
DROP TABLE | テーブル自体を削除する | 本当に不要か確認 |
DROP DATABASE | DB全体を削除する | 原則として手順化 |
ALTER TABLE | 構造を変える | 影響範囲とロック確認 |
UPDATE前チェック
SELECT COUNT(*)
FROM users
WHERE active = false;
対象件数を確認してから更新します。
UPDATE users
SET archived = true
WHERE active = false;
UPDATEはWHEREがないと全行更新になるため、WHERE句の有無を最初に見ます。
DELETE前チェック
削除対象を先に確認します。
SELECT id, email
FROM users
WHERE deleted_at IS NOT NULL;
件数も確認します。
SELECT COUNT(*)
FROM users
WHERE deleted_at IS NOT NULL;
その後に削除します。
DELETE FROM users
WHERE deleted_at IS NOT NULL;
トランザクション確認
不安な変更は、トランザクション内で確認します。
BEGIN;
UPDATE users
SET active = false
WHERE id = 1;
SELECT id, active
FROM users
WHERE id = 1;
ROLLBACK;
問題なければ、別途 COMMIT します。
TRUNCATE / DROP
TRUNCATE はテーブルの全行を高速に削除します。
TRUNCATE TABLE logs;
DROP TABLE はテーブル自体を削除します。
DROP TABLE old_logs;
これらは影響が大きいため、学習環境以外では手順書、バックアップ、レビューを前提にします。
ALTER TABLE
ALTER TABLE はテーブル構造を変えます。
ALTER TABLE users
ADD COLUMN last_login_at TIMESTAMP;
本番環境では、テーブルサイズやDB製品によってロックや処理時間が問題になることがあります。
実行直前の指差し確認
| 項目 | 確認 |
|---|---|
| DB名 | 想定のDBに接続している |
| テーブル名 | 操作対象が正しい |
| WHERE | 条件がある、または全件対象の理由がある |
| 件数 | SELECT COUNT(*) で確認済み |
| 戻し方 | ROLLBACK またはバックアップがある |
「たぶん大丈夫」で変更系SQLを実行しないことが、最も重要な安全対策です。
まとめ
危険なSQL操作では、接続先、対象、件数、戻し方を確認します。UPDATE と DELETE は同じ条件で SELECT し、TRUNCATE、DROP、ALTER TABLE は影響が大きいため、学習環境以外では手順化して扱います。