Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Kunci Asing Beberapa Kolom:Setel satu kolom ke Null ON DELETE alih-alih semua

Setelah beberapa penelitian, sepertinya persyaratan khusus itu tidak dapat diterapkan menggunakan kunci asing.

Solusi terbaik tampaknya menggunakan campuran Foreign Keys dan Pemicu .

Masalah dapat diselesaikan untuk contoh yang diberikan dengan pernyataan berikut:

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;

Perhatikan bahwa "ON DELETE CASCADE" dari kunci asing terakhir tidak akan pernah mengarah ke penghapusan berjenjang karena Pemicu telah menghapus referensi kunci asing dengan membatalkan baris yang sesuai.

Tambahan:Alih-alih menggunakan "ON DELETE CASCADE" seseorang dapat menggunakan "ON DELETE SET NULL" dengan pemicu yang sama, tetapi kemudian "lectureId" harus nullable dan harus menyertakan "CHECK (lectureId TIDAK NULL)" untuk memastikannya tidak pernah disetel ke 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. Apakah aman menggunakan LIMIT tanpa ORDER BY

  2. Apakah ada cara untuk men-cache Tampilan sehingga kueri terhadapnya cepat?

  3. Cara mengurai waktu dari database

  4. Perlu kueri MySQL untuk memilih dari tabel yang menyimpan pasangan nilai kunci

  5. Hentian halaman dalam HTML2Pdf