ich eine SQL-Tabelle, wie unten definiert habe:Composite-Primärschlüssel und Fremdschlüssel Einschränkungsfehler
CREATE TABLE [TestComposite] (
ID int,
SiteUrl nvarchar(255),
Name nvarchar(max) NOT NULL,
ParentID int NULL,
PRIMARY KEY (ID, SiteUrl)
);
Elemente und Ordner in der gleichen Tabelle gespeichert werden, wenn ein Element in einem Ordner ist, ist die ParentID Spalte des ID des Ordners Und ich würde gerne in der Lage sein, CASCADE Elemente/Ordner zu löschen, wenn ich einen Ordner lösche.
kann ein Beispiel deutlicher sein:
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...
Also, wenn ich den Artikel 3 (ein Ordner) löschen, möchte ich die Elemente/Ordner 4, 5, 6 und 7 zu streichen.
Ich habe versucht, eine Einschränkung ähnlich wie hinzuzufügen:
ALTER TABLE [TestComposite]
ADD CONSTRAINT fk_parentid
FOREIGN KEY (ParentID, SiteUrl)
REFERENCES [TestComposite] (ID, SiteUrl) ON DELETE CASCADE;
Aber es gibt mir diese Fehlermeldung:
FOREIGN KEY-Einschränkung Introducing ‚fk_parentid‘ auf dem Tisch ‚TestComposite‘ Zyklen oder mehrere Kaskadenwege verursachen können. Geben Sie ON DELETE NO ACTION oder ON UPDATE NO ACTION an, oder ändern Sie andere FOREIGN KEY-Einschränkungen.
Ich habe auch versucht, eine zweite SiteUrl-Spalte namens ParentSiteUrl, falls das Problem war, dass eine Spalte nicht Teil der gleichen FK/PK sein sollte, aber ich habe die gleiche Fehlermeldung.
Mache ich etwas falsch?
Danke,
Ich mag mich irren, da ich es noch nicht getestet habe, aber ich glaube nicht, dass es das Element 7 in meinem Fall löschen würde, da es auf einer anderen Ebene der Hierarchie ist?! –
'@ OmaR': ja es wird' 7' auch löschen. Es ist ein rekursives 'CTE'. – Quassnoi
Danke, es funktioniert super. Ich wusste nichts über rekursive CTE. Und es scheint, dass es auf SQL Server 2005 und SQL Server 2008 funktioniert. –