私は2つのテーブルを持っています:T1とT2、それらはデータを持つ既存のテーブルです。 T1とT2の間には1対多の関係があります。 T1からのレコードが削除されたときにSQL Serverでカスケード削除を実行するようにテーブル定義を変更する方法、T2内のすべての関連レコードも削除されます。
それらの間には、外部からの制約があります。 T2を削除するためにテーブルを削除したり、トリガーを作成したりする必要はありません。たとえば、従業員を削除すると、レビューレコードもすべて削除されます。
T1 - 従業員、
Employee ID
Name
Status
T2 - パフォーマンスレビュー、
Employee ID - 2009 Review
Employee ID - 2010 Review
あなたがする必要があります、
ON DELETE CASCADE
設定を有効にして新しいものを追加します。何かのようなもの:
ALTER TABLE dbo.T2
DROP CONSTRAINT FK_T1_T2 -- or whatever it's called
ALTER TABLE dbo.T2
ADD CONSTRAINT FK_T1_T2_Cascade
FOREIGN KEY (EmployeeID) REFERENCES dbo.T1(EmployeeID) ON DELETE CASCADE
SQL Server Management Studioで既存の外部キーに "Cascade delete"を追加するには
まず、あなたの外部キーを選択し、新しいクエリウィンドウでそれを "DROP and Create To .."で開きます。
次に、ON DELETE CASCADE
コマンドにADD CONSTRAINT
を追加します。
ところで、あなたの外部キーのリストを取得し、どのキーが "Cascade delete"をオンにしているかを見るために、あなたはこのスクリプトを実行することができます:
SELECT
OBJECT_NAME(f.parent_object_id) AS 'Table name',
COL_NAME(fc.parent_object_id,fc.parent_column_id) AS 'Field name',
delete_referential_action_desc AS 'On Delete'
FROM sys.foreign_keys AS f,
sys.foreign_key_columns AS fc,
sys.tables t
WHERE f.OBJECT_ID = fc.constraint_object_id
AND t.OBJECT_ID = fc.referenced_object_id
ORDER BY 1
外部キー制約のために特定のテーブルをDROP
することはできませんが、どのFKが問題を引き起こしているのかわからない場合は、次のコマンドを実行します。
sp_help 'TableName'
その記事のSQLには、特定のテーブルを参照するすべてのFKがリストされています。
これがすべて役立つことを願っています。
長指の謝罪私はただ主張しようとしていました。
SQL Server Management Studioを使ってこれを行うことができます。
→テーブルデザインを右クリックして[リレーションシップ]に移動し、左側のペインと右側のペインで外部キーを選択して、メニューの[挿入と更新の指定]を展開し、削除規則として[カスケード]を選択します。
のようなものを使う
ALTER TABLE T2
ADD CONSTRAINT fk_employee
FOREIGN KEY (employeeID)
REFERENCES T1 (employeeID)
ON DELETE CASCADE;
正しい列名を入力すると設定されます。 mark_sが正しく述べているように、すでに適切な場所に外部キー制約がある場合は、まず古いものを削除してから新しいものを作成する必要があります。
ON DELETE CASCADE
親データを削除すると子データも削除することを指定します。
CREATE TABLE products
( product_id INT PRIMARY KEY,
product_name VARCHAR(50) NOT NULL,
category VARCHAR(25)
);
CREATE TABLE inventory
( inventory_id INT PRIMARY KEY,
product_id INT NOT NULL,
quantity INT,
min_level INT,
max_level INT,
CONSTRAINT fk_inv_product_id
FOREIGN KEY (product_id)
REFERENCES products (product_id)
ON DELETE CASCADE
);
この外部キーには、親テーブルのデータが削除されたときに、子テーブルの対応するレコードを削除するようにSQL Serverに指示するON DELETE CASCADE
句を指定しました。したがって、この例では、product_id値がproductsテーブルから削除されると、このproduct_idを使用する在庫テーブル内の対応するレコードも削除されます。
ONCascadeプロパティを最初に有効にするには /
1.既存の外部キー制約を削除します
2. ON DELETE CASCADE設定を有効にして新しいものを追加します
例:
IF EXISTS(SELECT 1 FROM sys.foreign_keys WHERE parent_object_id = OBJECT_ID(N'dbo.Response'))
BEGIN
ALTER TABLE [dbo].[Response] DROP CONSTRAINT [FK_Response_Request]
ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request] FOREIGN KEY([RequestId])
REFERENCES [dbo].[Request] ([RequestId])
ON DELETE CASCADE
END
ELSE
BEGIN
ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request] FOREIGN KEY([RequestId])
REFERENCES [dbo].[Request] ([RequestId])
ON DELETE CASCADE
END
ONCascadeプロパティを2番目に無効にします。
1.既存の外部キー制約を削除します
2. [アクションを実行する]設定を有効にして新しいアカウントを追加する
例:
IF EXISTS(SELECT 1 FROM sys.foreign_keys WHERE parent_object_id = OBJECT_ID(N'dbo.Response'))
BEGIN
ALTER TABLE [dbo].[Response] DROP CONSTRAINT [FK_Response_Request]
ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request] FOREIGN KEY([RequestId])
REFERENCES [dbo].[Request] ([RequestId])
ON DELETE CASCADE
END
ELSE
BEGIN
ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request] FOREIGN KEY([RequestId])
REFERENCES [dbo].[Request] ([RequestId])
ON DELETE NO ACTION
END