Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Klucz obcy z wieloma kolumnami:Ustaw pojedynczą kolumnę na wartość Null ON DELETE zamiast na wszystkie

Po kilku badaniach wydaje się, że tego konkretnego wymagania nie można zaimplementować przy użyciu kluczy obcych.

Wydaje się, że najlepszym rozwiązaniem jest użycie kombinacji kluczy obcych i wyzwalacz .

Problem można rozwiązać dla podanego przykładu za pomocą następujących stwierdzeń:

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;

Zwróć uwagę, że „ON DELETE CASCADE” ostatniego klucza obcego nigdy nie doprowadzi do kaskadowego usunięcia, ponieważ wyzwalacz już usunął odwołania do klucza obcego poprzez zerowanie odpowiednich wierszy.

Dodatek:Zamiast używać „ON DELETE CASCADE” można użyć „ON DELETE SET NULL” z tym samym wyzwalaczem, ale wtedy „lectureId” musi mieć wartość null i należy dołączyć „CHECK (lectureId IS NOT NULL)” aby upewnić się, że nigdy nie jest ustawiony na null




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dane wejściowe użytkownika, wyczyść i odkaż przed wysłaniem do db

  2. GRUPUJ WEDŁUG MAKSYMALNEJ DATY

  3. Tabela MySQL z kolumną varchar jako kluczem obcym

  4. Czy mogę mieć klucz podstawowy bez indeksu klastrowego? Czy mogę mieć wielowartościowy indeks klastrowy?

  5. Błąd SQLAlchemy Serwer MySQL zniknął