24

同じテーブルを指す複数の外部キーでカスケードが必要な問題があります..

[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

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

したがって、insight_id だけにカスケードを追加しようとすると、次のようになります。

DELETE ステートメントが REFERENCE 制約と矛盾しています

何か案は?

ありがとう

ダニエル

4

1 に答える 1

32

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

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)

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

于 2011-02-16T15:18:26.690 に答える