2013-06-25 246 views
0

我试图实现this,但我得到一个循环或多个级联路径,无法看到问题出在哪里以及如何解决。递归多对多关系

CREATE TABLE Staff(
    Id INT NOT NULL PRIMARY KEY 
) 

CREATE TABLE Supevision (
    SupervisorId INT NOT NULL FOREIGN KEY REFERENCES Staff(Id) ON UPDATE CASCADE ON DELETE CASCADE, 
    SupervisedId INT NOT NULL FOREIGN KEY REFERENCES Staff(Id) ON UPDATE CASCADE ON DELETE CASCADE, 
    PRIMARY KEY (SupervisorId, SupervisedId) 
) 
+1

更具体地说,您有*多个*级联路径,而不是循环路径。错误消息提到了两者。 –

+2

您通过删除ON UPDATE CASCADE ON DELETE CASCADE子句来解决错误。 –

回答

0

您可以删除其中一个外部约束,但将其替换为触发器。

DROP TABLE Supevision 
DROP TABLE Staff 


CREATE TABLE Staff(
    Id INT NOT NULL PRIMARY KEY 
) 
GO 

CREATE TABLE Supevision (
    SupervisorId INT NOT NULL FOREIGN KEY REFERENCES Staff(Id) ON UPDATE CASCADE ON DELETE CASCADE, 
    SupervisedId INT NOT NULL --FOREIGN KEY REFERENCES Staff(Id) ON UPDATE CASCADE ON DELETE CASCADE, 
    PRIMARY KEY (SupervisorId, SupervisedId) 
) 
GO 

CREATE TRIGGER DELETEStuff 
    ON Staff 
    FOR DELETE 
AS 
BEGIN 

    DELETE sv 
    FROM deleted d 
    INNER JOIN Supevision sv 
     ON d.Id = sv.SupervisedId 

    DELETE sv 
    FROM deleted d 
    INNER JOIN Supevision sv 
     ON d.Id = sv.SupervisorId 

END 
GO 

CREATE TRIGGER UPDATEStuff 
    ON Staff 
    FOR UPDATE 
AS 
BEGIN 
    UPDATE Supevision 
    SET SupervisedId = inserted.id 
    FROM inserted, deleted 
    WHERE Supevision.SupervisedId = deleted.Id 

    UPDATE Supevision 
    SET SupervisorId = inserted.id 
    FROM inserted, deleted 
    WHERE Supevision.SupervisorId = deleted.Id 

END 
GO 

INSERT INTO Staff (ID) 
VALUES (1), (2), (3), (4), (5), (6), (7) 

INSERT INTO Supevision (SupervisorId, SupervisedId) 
VALUES (1, 2), (2, 3), (3, 4), (5, 6), (6, 7) 

DELETE FROM Staff WHERE ID = 3 

UPDATE Staff SET Id = 60 WHERE Id=6 

SELECT * FROM Supevision 
SELECT * FROM Staff 
+0

这与正常级联有何不同? – Philippe

+0

从最终结果的角度来看 - 没有区别。 –

1

尝试这个:

表:STAFF

CREATE TABLE IF NOT EXISTS `staff` (
    `id` int(5) NOT NULL AUTO_INCREMENT, 
    `name` varchar(15) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT 

表:Supevision

CREATE TABLE IF NOT EXISTS `supevision` (
    `details_id` int(5) NOT NULL AUTO_INCREMENT, 
    `SupervisorId` int(5) NOT NULL, 
    `SupervisedId` int(5) NOT NULL, 
    `is` int(1) NOT NULL DEFAULT '1', 
    PRIMARY KEY (`details_id`), 
    KEY `SupervisorId` (`SupervisorId`), 
    KEY `SupervisedId` (`SupervisedId`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT 

查询

ALTER TABLE `supevision` 
    ADD CONSTRAINT `supevision_ibfk_2` FOREIGN KEY (`SupervisedId`) REFERENCES `staff` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, 
    ADD CONSTRAINT `supevision_ibfk_1` FOREIGN KEY (`SupervisorId`) REFERENCES `staff` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;