sql >> Databasteknik >  >> RDS >> Mysql

Flera kolumner främmande nyckel:Ställ in en kolumn till Null PÅ DELETE istället för alla

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




  1. Ingen lämplig drivrutin hittades för jdbc i Spark

  2. flytta tabell från ett schema till ett annat schema?

  3. postgres standardtidszon

  4. Varför används inga nycklar i denna EXPLAIN?