9

テーブルに 2 つの外部キーがあります。table が呼び出されNews、外部キーupdatedByIdおよびがありcreatedById、どちらもuserIdtable 内を指していると仮定しますUsers

NULLユーザーが削除されたときに外部キーに設定したいのですがON DELETE SET NULL、その関係を設定しようとすると、次のようになります。

テーブル 'News' に FOREIGN KEY 制約 'FK_News_Users' を導入すると、サイクルまたは複数のカスケード パスが発生する可能性があります。ON DELETE NO ACTION または ON UPDATE NO ACTION を指定するか、他の FOREIGN KEY 制約を変更します。

両方の外部キーを null に設定できない理由がわかりません。

4

3 に答える 3

10

複数のカスケード アクション

単一の DELETE または UPDATE によってトリガーされる一連のカスケード参照アクションは、循環参照を含まないツリーを形成する必要があります。DELETE または UPDATE の結果として生じるすべてのカスケード参照アクションのリストに、テーブルが複数回出現することはありません。また、カスケード参照アクションのツリーには、指定されたテーブルへの複数のパスがあってはなりません。ツリーの分岐は、NO ACTION が指定されているか、デフォルトであるテーブルに遭遇すると終了します。

このような状況では、ユーザーを物理的にではなく論理的に削除する機能を実装することを検討することをお勧めします (たとえば、フラグ フィールド Active または Deleted をUsersテーブルに導入するなど)。そうすれば、すべての関係が損なわれず、遡及的に分析できます。

ON DELETE SET NULLただし、両方の FKを実装する必要がある場合は、次のようにテーブルでFOR DELETEトリガーを使用できます。User

CREATE TRIGGER Users_News_Delete_Trigger 
ON Users FOR DELETE
AS BEGIN
    UPDATE News SET createdById = NULL 
     WHERE createdById = DELETED.id;
    UPDATE News SET updatedById = NULL 
     WHERE updatedById = DELETED.id;
END
于 2013-01-28T01:36:14.837 に答える