web-dev-qa-db-ja.com

MS SQL "ON DELETE CASCADE"同じテーブルを指す複数の外部キー?

ハウディ、同じテーブルを指す複数の外部キーにカスケードが必要な問題があります。

[Insights]
| ID | Title        |
| 1  | Monty Python |
| 2  | Spamalot     | 

[BroaderInsights_Insights]
| broaderinsight_id | insight_id |
| 1                 | 2          |

基本的に、インサイトテーブルのレコード1つまたは2つが削除されると、関係も削除する必要があります。

私はこれを試しました:

 CREATE TABLE broader_insights_insights(id INT NOT NULL IDENTITY(1,1),
   broader_insight_id INT NOT NULL REFERENCES insights(id) ON DELETE CASCADE,
   insight_id INT NOT NULL REFERENCES insights(id) ON DELETE CASCADE,
   PRIMARY KEY(id))
Go

これにより、カスケードが「サイクルまたは複数のカスケードパスを引き起こす可能性がある」という警告が表示されます。

そこで、iveはinsight_idだけにカスケードを追加しようとしましたが、結果は次のようになります。

「DELETEステートメントがREFERENCE制約と競合しました」

何か案は?

ありがとう

ダニエル

21
Daniel Upton

これを機能させるには、これをインサイトのINSTEADOF削除トリガーとして実装する必要があります。何かのようなもの:

create trigger T_Insights_D
on Insights
instead of delete
as
    set nocount on
    delete from broader_insights_insights
    where insight_id in (select ID from deleted) or
    broader_insight_id in (select ID from deleted)

    delete from Insights where ID in (select ID from deleted)

多くの場合、カスケード削除と多くの外部キーでは、「ツリー」の最上位で発生する削除が参照テーブルに正常にカスケードされるように、「カスケード」順序を計算するために時間を費やす必要があります。しかし、この場合、それは不可能です。

28