意図しないデータ削除を防ぐ!SQL Server で安全なカスケード削除を行う
SQL Server でカスケード削除を使用する方法
カスケード削除を使用する手順
- 外部キー制約を作成する
子テーブルに、親テーブルの主キーを参照する外部キー制約を作成する必要があります。この制約を作成する際に、ON DELETE CASCADE
オプションを指定します。
CREATE TABLE 子テーブル (
子テーブルID INT PRIMARY KEY,
親テーブルID INT,
FOREIGN KEY (親テーブルID) REFERENCES 親テーブル (親テーブルID) ON DELETE CASCADE
);
- 親テーブルのレコードを削除する
親テーブルのレコードを削除すると、関連する子テーブルのレコードも自動的に削除されます。
DELETE FROM 親テーブル
WHERE 親テーブルID = 1;
例
親テーブル
と 子テーブル
という2つのテーブルがあるとします。親テーブル
には 親テーブルID
という主キーがあり、子テーブル
には 親テーブルID
を参照する 親テーブルID
という外部キーがあります。
CREATE TABLE 親テーブル (
親テーブルID INT PRIMARY KEY,
名前 VARCHAR(50)
);
CREATE TABLE 子テーブル (
子テーブルID INT PRIMARY KEY,
親テーブルID INT,
FOREIGN KEY (親テーブルID) REFERENCES 親テーブル (親テーブルID) ON DELETE CASCADE
);
DELETE FROM 親テーブル
WHERE 親テーブルID = 1;
カスケード削除を使用する際の注意点
- カスケード削除を使用すると、意図せずデータが削除される可能性があります。使用する前に、影響を受けるすべてのテーブルをよく理解しておく必要があります。
- カスケード削除は、参照整合性を保証するものではありません。親テーブルのレコードが削除された後、子テーブルのレコードが更新される可能性があります。
- カスケード削除は、パフォーマンスに影響を与える可能性があります。大規模なテーブルでカスケード削除を使用する場合は、事前にテストを行うことをお勧めします。
-- テーブルの作成
CREATE TABLE 親テーブル (
親テーブルID INT PRIMARY KEY,
名前 VARCHAR(50)
);
CREATE TABLE 子テーブル (
子テーブルID INT PRIMARY KEY,
親テーブルID INT,
FOREIGN KEY (親テーブルID) REFERENCES 親テーブル (親テーブルID) ON DELETE CASCADE
);
-- データの挿入
INSERT INTO 親テーブル (名前) VALUES ('親テーブル1');
INSERT INTO 親テーブル (名前) VALUES ('親テーブル2');
INSERT INTO 子テーブル (親テーブルID) VALUES (1);
INSERT INTO 子テーブル (親テーブルID) VALUES (1);
INSERT INTO 子テーブル (親テーブルID) VALUES (2);
-- 親テーブルのレコードの削除
DELETE FROM 親テーブル
WHERE 親テーブルID = 1;
-- 結果
SELECT * FROM 子テーブル;
-- 結果:
-- 子テーブルID | 親テーブルID
-- ----------- | -----------
-- 3 | 2
このコードを実行すると、親テーブルID
が 1 である親テーブルのレコードが削除されます。同時に、親テーブルID
が 1 である子テーブルのレコードもすべて削除されます。
- 複数の外部キーを持つテーブルでカスケード削除を使用する:
CREATE TABLE 孫テーブル (
孫テーブルID INT PRIMARY KEY,
親テーブルID INT,
FOREIGN KEY (親テーブルID) REFERENCES 親テーブル (親テーブルID) ON DELETE CASCADE
);
CREATE TABLE 子テーブル (
子テーブルID INT PRIMARY KEY,
親テーブルID INT,
FOREIGN KEY (親テーブルID) REFERENCES 親テーブル (親テーブルID) ON DELETE CASCADE
);
-- ...
DELETE FROM 親テーブル
WHERE 親テーブルID = 1;
-- 結果:
-- 孫テーブルID | 親テーブルID
-- ------------- | -----------
-- 子テーブルID | 親テーブルID
-- ------------- | -----------
- トリガーを使用してカスケード削除を実装する:
CREATE TRIGGER カスケード削除
ON 親テーブル
AFTER DELETE
AS
BEGIN
DELETE FROM 子テーブル
WHERE 親テーブルID = OLD.親テーブルID;
END;
-- ...
DELETE FROM 親テーブル
WHERE 親テーブルID = 1;
-- 結果:
-- 子テーブルID | 親テーブルID
-- ------------- | -----------
これらのサンプルコードは、カスケード削除のさまざまな使用方法を示しています。具体的な要件に合わせて、コードを適宜変更してください。
SQL Server でカスケード削除を使用するその他の方法
- 外部キー制約の ON DELETE オプション
- トリガー
それぞれの特徴と利点・欠点について、詳しく解説します。
外部キー制約の ON DELETE オプション
概要
外部キー制約を作成する際に、ON DELETE CASCADE
オプションを指定することで、カスケード削除を設定できます。これは、最もシンプルで一般的な方法です。
利点
- 簡単でわかりやすい
- 特別な権限が不要
欠点
- 誤操作で意図せずデータが削除される可能性がある
- 参照整合性を保証しない
- パフォーマンスに影響を与える可能性がある
CREATE TABLE 子テーブル (
子テーブルID INT PRIMARY KEY,
親テーブルID INT,
FOREIGN KEY (親テーブルID) REFERENCES 親テーブル (親テーブルID) ON DELETE CASCADE
);
注意事項
- 外部キー制約を変更するには、テーブルのスキーマを変更する必要があります。
- カスケード削除を無効にするには、
ON DELETE NO ACTION
オプションを指定します。
トリガー
トリガーを使用して、親テーブルのレコードが削除された後に、子テーブルのレコードを自動的に削除する処理を実装できます。
- より柔軟な制御が可能
- パフォーマンスを最適化できる
- 外部キー制約よりも複雑
CREATE TRIGGER カスケード削除
ON 親テーブル
AFTER DELETE
AS
BEGIN
DELETE FROM 子テーブル
WHERE 親テーブルID = OLD.親テーブルID;
END;
- トリガーは、データベースのイベントに対して実行されるプログラムです。
- トリガーを作成するには、適切な権限が必要です。
- ストアドプロシージャ
ストアドプロシージャを使用して、カスケード削除の処理を実装することもできます。
- アプリケーションコード
- シンプルでわかりやすい方法を求める場合は、外部キー制約の
ON DELETE CASCADE
オプションを使用するのがおすすめです。 - より柔軟な制御が必要な場合は、トリガーを使用するのがおすすめです。
- パフォーマンスが重要な場合は、ストアドプロシージャやアプリケーションコードを使用して、独自の処理を実装するのがおすすめです。
sql-server cascading-deletes