0Pricing
SQL Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 複数行のINSERT
  2. UPSERT:ON CONFLICT DO UPDATE(PostgreSQL)
  3. FROMとJOIN形式のUPDATE
  4. USING付きDELETEと安全なパターン
← SQL Academyに戻る