📜  MySQL – ON DELETE CASCADE 约束

📅  最后修改于: 2021-09-09 11:50:12             🧑  作者: Mango

在 MySQL 中使用 ON DELETE CASCADE约束在删除父表中的行时自动从子表中删除行。例如,当学生在在线学习平台上注册时,该学生的所有详细信息都会以其唯一编号/ID 记录。这些在线学习平台上的所有课程都有自己的代码、标题和名称。学生可以根据自己的意愿报读任何课程。

没有规定所有学生必须注册所有课程,或者他们必须在同一日期参加课程。一个学生可以注册一门或多门课程。假设您从“Student”表中删除了一行,现在您还想删除“Enroll”表中引用“Student”表中的行的所有行。为此,我们需要 ON DELETE CASCADE。下面是解释 ON DELETE CASCADE 引用操作如何工作的步骤。

步骤 1:创建学生

CREATE TABLE Student (
    sno INT PRIMARY KEY,
    sname VARCHAR(20),
    age INT

);

第 2 步:将行插入到 学生

INSERT INTO Student(sno, sname,age) 
 VALUES(1,'Ankit',17),
       (2,'Ramya',18),
       (3,'Ram',16);

第 3 步:执行 SELECT查询以检查STUDENT表中的数据。

SELECT *
FROM Student;

输出:

sno sname age
1 Ankit 17
2 Ramya 18
3 Ram 16

步骤 4:创建课程

CREATE TABLE Course (
    cno INT PRIMARY KEY,
    cname VARCHAR(20)
);

第 5 步:将行插入 课程

INSERT INTO Course(cno, cname) 
 VALUES(101,'c'),
       (102,'c++'),
       (103,'DBMS');

第 6 步:执行 SELECT查询以检查Course表中的数据。

SELECT *
FROM Course;

输出:

cno cname
101 c
102 c++
103 DBMS

步骤 7:创建Enroll 

CREATE TABLE Enroll (
    sno INT,
    cno INT,
    jdate date,
    PRIMARY KEY(sno,cno),
    FOREIGN KEY(sno) 
        REFERENCES Student(sno)
        ON DELETE CASCADE
    FOREIGN KEY(cno) 
        REFERENCES Course(cno)
        ON DELETE CASCADE
);

第 8 步:将行插入到 登记

INSERT INTO Enroll(sno,cno,jdate) 
 VALUES(1, 101, '5-jun-2021'),
       (1, 102, '5-jun-2021'),
       (2, 103, '6-jun-2021');

第 9 步:执行 SELECT查询以检查Enroll表中的数据。

SELECT *
FROM Enroll;

输出:

sno cno jdate
1 101 5-jun-2021
1 102 5-jun-2021
2 103 6-jun-2021

步骤 10 :这里的父表是StudentCourse而子表是Enroll 。如果学生退出课程或课程从提供列表中删除,它也必须影响子表。

DELETE FROM Student
WHERE sname="Ramya";

第 11 步:执行 SELECT查询来检查数据。

Select * from Student;

输出:

sno sname age
1 Ankit 17
3 Ram 16
Select * from Enroll;

输出:

sno cno jdate
1 101 5-jun-2021
1 102 5-jun-2021

当您删除父表中 sno=2 的内容时,它也会自动从子表中删除 sno=2 的详细信息。同样,如果您从 Course 表中删除一门课程,它会自动删除子表 Enroll 中该课程的行。这是因为指定了外键约束 ON DELETE CASCADE。