5

以下のように定義された 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 列も追加しようとしましたが、同じエラー メッセージが表示されます。

私は何か間違ったことをしていますか?

ありがとうございました、

4

4 に答える 4

6

制約を作成し、ON DELETE NO ACTIONこれを使用してすべてのレコードとその子を削除します。

WITH    q AS
        (
        SELECT  id, SiteURL
        FROM    TestComposite
        WHERE   id = 3
                AND SiteURL = 'site1'
        UNION ALL
        SELECT  tc.id, tc.SiteURL
        FROM    q
        JOIN    TestComposite tc
        ON      tc.ParentID = q.Id
                AND tc.SiteURL = q.SiteURL
        )
DELETE
FROM    TestComposite
WHERE   EXISTS
        (
        SELECT  id, SiteURL
        INTERSECT
        SELECT  *
        FROM    q
        )
于 2010-03-03T13:14:33.257 に答える
1

SQL Server 2008 を使用している場合は、この作業に from HierarchyIDタイプを使用します。

于 2010-03-03T13:13:20.203 に答える
0

ParentId という新しい列を追加し、それを主キーを持つ外部キーとして宣言することで、あなたがやりたいことを達成できると思います。そうすれば問題は解決し、やりたいことはすべてできる

于 2010-03-03T13:02:20.247 に答える
0

問題は、再帰的なカスケードの可能性を作成することです-カスケードによって削除されるたびに、後続の削除がいくつでも作成される可能性があります。MS SQL はサポートしていません。コード内でそれらを手動で削除してみてください。ところで、カスケード削除はお勧めしません。

http://support.microsoft.com/kb/321843

于 2010-03-03T13:02:21.127 に答える