web-dev-qa-db-ja.com

SQL Serverでカスケード削除を使用する方法

私は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
289
Bichvan Nguyen

あなたがする必要があります、

  • 既存の外部キー制約を削除します。
  • 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
327
marc_s

SQL Server Management Studioで既存の外部キーに "Cascade delete"を追加するには

まず、あなたの外部キーを選択し、新しいクエリウィンドウでそれを "DROP and Create To .."で開きます。

enter image description here

次に、ON DELETE CASCADEコマンドにADD CONSTRAINTを追加します。

n そして「実行」ボタンを押してこのクエリを実行します。

ところで、あなたの外部キーのリストを取得し、どのキーが "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がリストされています。

これがすべて役立つことを願っています。

長指の謝罪私はただ主張しようとしていました。

258
Mike Gledhill

SQL Server Management Studioを使ってこれを行うことができます。

→テーブルデザインを右クリックして[リレーションシップ]に移動し、左側のペインと右側のペインで外部キーを選択して、メニューの[挿入と更新の指定]を展開し、削除規則として[カスケード]を選択します。

SQL Server Management Studio

151
Palanikumar

のようなものを使う

ALTER TABLE T2
ADD CONSTRAINT fk_employee
FOREIGN KEY (employeeID)
REFERENCES T1 (employeeID)
ON DELETE CASCADE;

正しい列名を入力すると設定されます。 mark_sが正しく述べているように、すでに適切な場所に外部キー制約がある場合は、まず古いものを削除してから新しいものを作成する必要があります。

42
Hyperboreus

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を使用する在庫テーブル内の対応するレコードも削除されます。

14
Md Shahriar

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
14
ravula sandeep