Tôi có một bảng SQL được định nghĩa như sau:Khóa chính Composite và lỗi ràng buộc khoá ngoại
CREATE TABLE [TestComposite] (
ID int,
SiteUrl nvarchar(255),
Name nvarchar(max) NOT NULL,
ParentID int NULL,
PRIMARY KEY (ID, SiteUrl)
);
mục và thư mục được lưu trữ bên trong cùng một bảng, nếu một mục nằm bên trong một thư mục, cột ParentID là ID của thư mục. Và tôi muốn có thể xóa các mục/thư mục CASCADE khi tôi xóa một thư mục.
Một ví dụ có thể rõ ràng hơn:
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...
Vì vậy, nếu chúng ta xóa mục 3 (thư mục), tôi muốn các mục/thư mục 4, 5, 6 và 7 để bị xóa quá.
Tôi cố gắng thêm một hạn chế tương tự như:
ALTER TABLE [TestComposite]
ADD CONSTRAINT fk_parentid
FOREIGN KEY (ParentID, SiteUrl)
REFERENCES [TestComposite] (ID, SiteUrl) ON DELETE CASCADE;
Nhưng nó mang lại cho tôi lỗi này:
Giới thiệu ràng buộc khoá ngoại 'fk_parentid' trên bảng 'TestComposite' có thể gây ra chu kỳ hoặc nhiều đường thác. Chỉ định ON DELETE NO ACTION hoặc ON UPDATE NO ACTION, hoặc sửa đổi các ràng buộc KEY NGOẠI HỐI khác.
Tôi cũng đã cố gắng thêm cột SiteUrl thứ hai có tên ParentSiteUrl, trong trường hợp vấn đề là một cột không phải là một phần của cùng một FK/PK, nhưng tôi có cùng thông báo lỗi.
Tôi đang làm gì sai?
Cảm ơn bạn,
Tôi có thể sai vì tôi chưa thử nghiệm, nhưng tôi không nghĩ rằng nó sẽ xóa mục 7 trong trường hợp của tôi, vì nó ở cấp độ khác của hệ thống phân cấp ?! –
'@ OmaR': có nó cũng sẽ xóa' 7'. Đó là một 'CTE' đệ quy. – Quassnoi
Cảm ơn bạn, nó hoạt động tuyệt vời. Tôi không biết về CTE đệ qui. Và có vẻ như nó hoạt động trên cả SQL Server 2005 và SQL Server 2008. –