Efter lite forskning verkar det som att det specifika kravet inte går att implementera med hjälp av främmande nycklar.
Den bästa lösningen verkar vara att använda en blandning av utländska nycklar och en utlösare .
Problemet kan lösas för det givna exemplet med följande påståenden:
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;
Observera att "ON DELETE CASCADE" för den sista främmande nyckeln aldrig kommer att leda till en kaskadradering eftersom triggern redan tagit bort främmande nyckelreferenserna genom att nollställa motsvarande rader.
Tillägg:Istället för att använda "ON DELETE CASCADE" kan man använda "ON DELETE SET NULL" med samma trigger, men då måste "lectureId" vara nullbart och man bör inkludera en "CHECK (lectureId IS NOT NULL)" för att säkerställa att den aldrig är inställd på null