Mysql
 sql >> база данни >  >> RDS >> Mysql

Външен ключ за няколко колони:Задайте една колона на Null ПРИ ИЗТРИВАНЕ вместо всички

След известно проучване изглежда, че това конкретно изискване не е приложимо с помощта на външни ключове.

Най-доброто решение изглежда е използването на микс от външни ключове и Задействане .

Проблемът може да бъде решен за дадения пример със следните твърдения:

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;

Имайте предвид, че „ON DELETE CASCADE“ на последния външен ключ никога няма да доведе до каскадно изтриване, тъй като тригерът вече е премахнал препратките към външния ключ чрез нулиране на съответните редове.

Допълнение:Вместо да се използва „ON DELETE CASCADE“ може да се използва „ON DELETE SET NULL“ със същия тригер, но тогава „lectureId“ трябва да бъде нула и трябва да се включва „CHECK (lectureId IS NOT NULL)“ за да се гарантира, че никога не е настроен на 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. Не може да се свърже с RDS екземпляр от EC2 екземпляр

  2. Не може да се съхранява емоджи в базата данни

  3. Как да:Класиране на резултатите от търсенето

  4. Непрекъснато поточно поточно произволно аудио от базата данни

  5. Има ли MySQL еквивалент на preg_replace на PHP?