SQLには、データを読む SELECT だけでなく、データを追加・更新・削除する命令があります。これらは便利ですが、間違えると大量のデータに影響します。
一言でいうと
変更系SQLは、実行前にSELECTで対象を確認し、必要ならトランザクション内で実行します。
変更系SQLの種類
| SQL | 役割 |
|---|---|
INSERT | 行を追加する |
UPDATE | 既存の行を更新する |
DELETE | 行を削除する |
読み取りと違い、変更系SQLはデータベースの状態を変えます。そのため、実行前の確認が重要です。
INSERT
INSERT は新しい行を追加します。
INSERT INTO users (name, email)
VALUES ('Sato', 'sato@example.com');
追加後に内容を確認します。
SELECT id, name, email
FROM users
WHERE email = 'sato@example.com';
UPDATE
UPDATE は既存の行を更新します。
UPDATE users
SET email = 'new-sato@example.com'
WHERE id = 1;
ここで重要なのは WHERE です。WHERE がないと、全行が対象になります。
UPDATE users
SET active = false;
このSQLは、すべてのユーザーを無効化する可能性があります。
DELETE
DELETE は行を削除します。
DELETE FROM users
WHERE id = 1;
DELETE も WHERE がないと危険です。
DELETE FROM users;
これは、テーブル内の全行を削除するSQLです。
UPDATEとDELETEでは、WHERE句の有無を必ず確認します。
実行前のSELECT確認
変更系SQLを実行する前に、同じ条件で SELECT します。
SELECT id, name, email
FROM users
WHERE id = 1;
この結果を見て、対象が正しいと確認してから UPDATE や DELETE を実行します。
更新対象が複数行なら、件数も確認します。
SELECT COUNT(*)
FROM users
WHERE active = false;
トランザクション
トランザクションを使うと、変更を確定する前に確認できます。
BEGIN;
UPDATE users
SET active = false
WHERE id = 1;
SELECT id, name, active
FROM users
WHERE id = 1;
ROLLBACK;
問題なければ COMMIT、取り消すなら ROLLBACK します。
不安な更新は、BEGINしてから確認し、最後にCOMMITする流れにします。
よくある誤解
| 誤解 | 実際 |
|---|---|
DELETE しても簡単に戻せる | バックアップやトランザクションがなければ戻せないことがあります |
UPDATE は1行だけ変わる | WHERE 条件次第で何行でも変わります |
| 開発環境なら安全 | 接続先を間違える事故があります |
| SELECT確認は面倒 | 変更系SQLでは最も重要な安全確認です |
まとめ
INSERT は追加、UPDATE は更新、DELETE は削除です。UPDATE と DELETE は特に危険なので、同じ条件で SELECT し、対象行と件数を確認してから実行します。不安な操作ではトランザクションを使い、確認後に COMMIT します。