USING付きDELETEと安全なパターン
DELETE ... USINGで他のテーブルと結合した行を削除し、破壊的な操作の前にトランザクションとSELECTで確認します。
「USING付きDELETEと安全なパターン」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
基本的なDELETE
条件に一致する行を削除します。
DELETE FROM users WHERE id = 1;必ず先にSELECTでテストする
DELETEを実行する前に、同じWHERE条件を使ったSELECTを実行して、行数を確認します。
SELECT COUNT(*) FROM orders
WHERE status = 'cancelled' AND created_at < NOW() - INTERVAL '1 year';トランザクション内でのDELETE
破壊的な操作はトランザクションで囲み、ROLLBACKできるようにします。
BEGIN;
DELETE FROM orders WHERE status = 'cancelled' AND ...;
SELECT COUNT(*) FROM orders; -- sanity check
-- COMMIT; or ROLLBACK;WHEREのないDELETEは大惨事
DELETE FROM users;はテーブルを空にします。元に戻すボタンはありません。十分に注意してください。WHEREを入力するのにかかる1秒余りは、安価な保険です。
DELETE … USING(PostgreSQLのJOIN削除)
別のテーブルに基づいて、あるテーブルの行を削除します。
DELETE FROM orders o
USING users u
WHERE u.id = o.user_id
AND u.is_banned = true;サブクエリを使ったDELETE
標準的な代替方法です。
DELETE FROM orders
WHERE user_id IN (SELECT id FROM users WHERE is_banned);外部キーのカスケード
orders.user_idにON DELETE CASCADEが設定されている場合、ユーザーを削除すると、そのユーザーの注文も自動的に削除されます。便利ですが危険でもあるため、慎重に使用してください。
ALTER TABLE orders
ADD CONSTRAINT orders_user_fk
FOREIGN KEY (user_id) REFERENCES users(id)
ON DELETE CASCADE;ソフトデリート
多くのアプリケーションでは、行を実際には削除せず、deleted_atタイムスタンプを設定します。
UPDATE users SET deleted_at = NOW() WHERE id = $1;
-- Every query then has:
WHERE deleted_at IS NULL古いデータの整理
大きなテーブルを定期的に整理する場合は、長時間実行されるトランザクションを避けるため、バッチに分けて削除します。
DELETE FROM events
WHERE id IN (
SELECT id FROM events
WHERE created_at < NOW() - INTERVAL '90 days'
LIMIT 10000
);
-- run this in a loop until it returns 0 rows速度が重要な場合のTRUNCATE
テーブルを本当に空にしたい場合は、行をスキャンしないため、TRUNCATEのほうがDELETEより高速です。ただし、ROWトリガーは実行されず、すべての構成でロールバックできるわけではありません。
TRUNCATE TABLE staging_orders;
TRUNCATE TABLE staging_orders RESTART IDENTITY CASCADE;DELETEでのRETURNING
削除した行を取得します。アーカイブに便利です。
WITH deleted AS (
DELETE FROM orders WHERE status = 'archived' RETURNING *
)
INSERT INTO orders_archive SELECT * FROM deleted;まとめ
DELETEは最も危険なステートメントです。次の防御的なパターンを使用します。
- 先にSELECTを実行します
- ドライランとしてBEGIN; ... ; ROLLBACKを実行します
- 大量の削除はバッチ処理します
- ユーザーに表示するデータにはソフトデリートを優先します
- TRUNCATEはステージングテーブルだけで使用します
理解度チェック
WHEREなしでDELETE FROM users;を実行してしまいました。どうしますか。
よくある質問
「USING付きDELETEと安全なパターン」レッスンは無料ですか?
はい。「USING付きDELETEと安全なパターン」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「USING付きDELETEと安全なパターン」で何を学びますか?
DELETE ... USINGで他のテーブルと結合した行を削除し、破壊的な操作の前にトランザクションとSELECTで確認します。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「USING付きDELETEと安全なパターン」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 複数行のINSERT
- UPSERT:ON CONFLICT DO UPDATE(PostgreSQL)
- FROMとJOIN形式のUPDATE
- USING付きDELETEと安全なパターン