Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Khóa ngoại nhiều cột:Đặt cột đơn thành Null ON DELETE thay vì tất cả

Sau một số nghiên cứu, có vẻ như yêu cầu cụ thể đó không thể thực hiện được bằng cách sử dụng khóa ngoại.

Giải pháp tốt nhất dường như là sử dụng kết hợp Phím ngoại và một Trình kích hoạt .

Vấn đề có thể được giải quyết cho ví dụ đã cho bằng các câu sau:

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;

Lưu ý rằng "BẬT XÓA CASCADE" của khóa ngoại cuối cùng sẽ không bao giờ dẫn đến xóa theo tầng vì Trình kích hoạt đã loại bỏ các tham chiếu khóa ngoại bằng cách nhập rỗng các hàng tương ứng.

Bổ sung:Thay vì sử dụng "ON DELETE CASCADE", người ta có thể sử dụng "ON DELETE SET NULL" với cùng một trình kích hoạt, nhưng khi đó "LectId" phải có giá trị rỗng và một phần phải bao gồm "KIỂM TRA (LectId IS NOT NULL)" để đảm bảo nó không bao giờ được đặt thành 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. Cách sử dụng phân trang với laravel DB ::select query

  2. Laravel phàn nàn về truy vấn với các tham số được đặt tên trùng lặp

  3. Sự khác biệt giữa SQL và MySQL là gì

  4. Cách hiển thị đối chiếu của cơ sở dữ liệu trong MySQL

  5. Làm cách nào để chọn một hàng có giá trị lớn nhất cho một cột trong MySQL?