【发布时间】:2021-12-04 00:31:10
【问题描述】:
我的问题与此非常相似:Multiple Column Foreign Key: Set single column to Null "ON DELETE" instead of all
我将使用该问题及其代码。答案中的代码正是我要找的解决方案,但是有错误。
可能会列出一个学生参加讲座,也可以选择参加其中一个讲座组。如果讲座被删除,所有学生列表及其所有组都应该被删除。如果一个小组被删除,那么学生应该仍然被列出来参加讲座,但他们不应该再被分配到一个小组中。
以上所有工作。但是,如果我尝试更改讲座 ID,我希望 studentListed 和组中的引用会相应更新(在更新级联时),但是由于某种原因,它在此外键约束上失败:
#1452 - Cannot add or update a child row: a foreign key constraint fails
(`SomeDB`.`studentListed`, CONSTRAINT `studentListed_ibfk_1` FOREIGN KEY (`lectureId`)
REFERENCES `lectures` (`lectureId`) ON DELETE CASCADE ON UPDATE CASCADE)
为什么会这样?原因似乎是 studentListed 中的 LectureId 既是对讲座中的 LectureId 的引用,也是对组中的 LectureId 的引用,这本身就是一个引用。有没有更好的方法来做到这一点?
重现的Sql代码:
CREATE TABLE lectures (
lectureId INT NOT NULL,
title VARCHAR(10) NOT NULL,
PRIMARY KEY (lectureId)
);
CREATE TABLE groups (
lectureId INT NOT NULL,
groupNo INT NOT NULL,
title VARCHAR(10) NOT NULL,
PRIMARY KEY (lectureId,groupNo),
FOREIGN KEY (lectureId) REFERENCES lectures (lectureId)
ON UPDATE CASCADE ON DELETE CASCADE
);
CREATE TABLE studentListed (
studentId INT NOT NULL,
lectureId INT NOT NULL,
groupNo INT NULL,
PRIMARY KEY (studentId,lectureId),
FOREIGN KEY (lectureId) REFERENCES lectures (lectureId)
ON UPDATE CASCADE ON DELETE CASCADE,
FOREIGN KEY (lectureId,groupNo) REFERENCES groups (lectureId,groupNo)
ON UPDATE CASCADE ON DELETE CASCADE
);
CREATE TRIGGER GroupDelete BEFORE DELETE ON groups
FOR EACH ROW
UPDATE studentListed SET studentListed.groupNo = NULL
WHERE studentListed.lectureId = OLD.lectureId
AND studentListed.groupNo = OLD.groupNo;
INSERT INTO lectures
VALUES
(1, "lecture1");
INSERT INTO groups
VALUES
(1, 1, "group1");
INSERT INTO studentListed
VALUES
(1, 1, 1);
UPDATE lectures SET lectureId=2 WHERE lectureId=1; /* Offending line */
【问题讨论】:
-
请把提出这个问题所需的一切都放在这篇文章中。只提供您需要的东西并将其与您的问题联系起来。
标签: mysql sql foreign-keys