以下のように定義された SQL テーブルがあります。
CREATE TABLE [TestComposite] (
ID int,
SiteUrl nvarchar(255),
Name nvarchar(max) NOT NULL,
ParentID int NULL,
PRIMARY KEY (ID, SiteUrl)
);
アイテムとフォルダーは同じテーブル内に格納されます。アイテムがフォルダー内にある場合、ParentID 列はフォルダーの ID です。また、フォルダーを削除するときに、CASCADE アイテム/フォルダーを削除できるようにしたいと考えています。
例はより明白かもしれません:
INSERT INTO [TestComposite] VALUES (1, 'site1', 'Item1', NULL)
INSERT INTO [TestComposite] VALUES (2, 'site1', 'Item2', NULL)
INSERT INTO [TestComposite] VALUES (3, 'site1', 'Folder1', NULL)
INSERT INTO [TestComposite] VALUES (4, 'site1', 'Folder1.Item1', 3)
INSERT INTO [TestComposite] VALUES (5, 'site1', 'Folder1.Item2', 3)
INSERT INTO [TestComposite] VALUES (6, 'site1', 'Folder1.Folder1', 3)
INSERT INTO [TestComposite] VALUES (7, 'site1', 'Folder1.Folder1.Item1', 6)
etc...
したがって、アイテム 3 (フォルダー) を削除すると、アイテム/フォルダー 4、5、6、および 7 も削除されます。
次のような制約を追加しようとしました。
ALTER TABLE [TestComposite]
ADD CONSTRAINT fk_parentid
FOREIGN KEY (ParentID, SiteUrl)
REFERENCES [TestComposite] (ID, SiteUrl) ON DELETE CASCADE;
しかし、それは私にこのエラーを与えます:
テーブル 'TestComposite' に FOREIGN KEY 制約 'fk_parentid' を導入すると、サイクルまたは複数のカスケード パスが発生する可能性があります。ON DELETE NO ACTION または ON UPDATE NO ACTION を指定するか、他の FOREIGN KEY 制約を変更します。
列が同じ FK/PK の一部ではないという問題があった場合に備えて、ParentSiteUrl という名前の 2 つ目の SiteUrl 列も追加しようとしましたが、同じエラー メッセージが表示されます。
私は何か間違ったことをしていますか?
ありがとうございました、