sql >> Database teknologi >  >> RDS >> Mysql

Multiple Column Foreign Key:Indstil enkelt kolonne til Null ON SLET i stedet for alle

Efter nogle undersøgelser ser det ud til, at det særlige krav ikke kan implementeres ved hjælp af fremmednøgler.

Den bedste løsning ser ud til at være at bruge en blanding af fremmednøgler og en Trigger .

Problemet kan løses for det givne eksempel ved følgende udsagn:

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;

Bemærk, at "ON DELETE CASCADE" af den sidste fremmednøgle aldrig vil føre til en kaskadedelt sletning, da triggeren allerede har fjernet fremmednøglereferencerne ved at nulstille de tilsvarende rækker.

Tilføjelse:I stedet for at bruge "ON DELETE CASCADE" kunne man bruge "ON DELETE SET NULL" med den samme trigger, men så skal "lectureId" være nullbar, og man bør inkludere et "CHECK (lectureId IS NOT NULL)" for at sikre, at den aldrig er sat til null




  1. EM12c Database Tid brugt på at vente på advarsler

  2. PostgreSQL-funktion, der returnerer flere resultatsæt

  3. SQL cast datetime

  4. Bruger samme kolonne flere gange i WHERE-sætning