HOWTO · MySQL

MySQL 级联删除

本文介绍 MySQL 中的删除级联

本页内容

在 MySQL 语言中,约束是指在表上强制执行以避免某些异常的一组规则。

这些异常会导致表中出现错误记录。基于故障的行为,约束可以是各种类型。

它们是参照完整性、实体约束和语义约束。这些具有基于故障类型以及如何避免不一致行为的含义和用法。

让我们简要了解存在的约束类型。

  1. 实体约束是应用于表中存在的实体和属性的约束。

    它保持表列中显示的值的一致性。它通常被称为第一级验证,其中保持了列的完整性。

    例子:

    create table student (stu_id int primary key, stu_name varchar2(50), stu_dept varchar2(15));
    Insert into student values(111, 'ABC', 'Chemical');
    

    主键 是实体完整性约束,它在内部意味着 stu_id 列是唯一且非空值。stu_id 列中不允许重复,并且不允许非空值。

  2. 语义约束在列上强制执行,以显示表中存在的相似数据类型值。它通常在列上强制执行以使值一致并保持特定类型。

    例子:

    Stu_name varchar2(50);
    

    在上面的示例中,varchar2 是容量为 50 字节的数据类型,用于保存学生姓名。

    该列仅保留字符类型的值,不允许使用双精度值和整数值。因此,它是一种语义约束。

  3. 参照完整性是应用于其他表以对数据实施限制的约束。最常用的约束是外键约束。

    如果父表有修改,子表应与父表保持一致。如果是删除记录的情况,则子记录中的引用不应保持悬空,并且是引用完整性约束。

    例子:

    create table report_card (stu_roll_number int, stu_marks int, stu_course varchar2(30) references student);
    

    在上面的示例中,成绩单显示了父表 student 中学生的部门或课程。如果引用完整性约束被应用,那么一个表中的操作将影响子表中的工作。

在参照完整性约束下,on delete cascade 是参照完整性约束,如果父记录被删除,它会自动删除子记录。它是对从外键采取的引用动作的响应。

例子:

CREATE TABLE Student (stu_id int(10) NOT NULL, name varchar(10) NOT NULL, birthdate date NOT NULL, PRIMARY KEY (stu_id));

上面的查询创建了一个表 student,其属性或列作为学生 ID,int 类型和主键作为列的实体约束。其他值属性包括名称和生日,其数据类型为 varchardate

CREATE TABLE Department (dept_id int(20) PRIMARY KEY NOT NULL,stu_id int(10) NOT NULL, dept_name varchar(20) NOT NULL, FOREIGN KEY (stu_id) REFERENCES Student (stu_id) ON DELETE CASCADE);

在上面的查询中,形成了一个部门表,其属性为 id、部门名称和学生 id。此外,学生 ID 将充当父表中的引用或外键。

这里的 on delete cascade 约束说,当学生 id 发生任何删除时,它从部门表中的条目也将被删除。因此,删除后不会有与该系学生对应的条目。

让我们在表中插入记录,看看这里的操作是如何工作的。

首先,在表 Student 中插入记录。

INSERT INTO Student (stu_id, name, birthdate) VALUES  
(101, 'John', '1995-11-12'),  
(102, 'Jian', '1983-07-19'),  
(103, 'Jackey', '1965-10-23');

上面的查询将在表 Student 中插入三条记录。

在表部门中插入记录。

INSERT INTO Department (dept_id, stu_id, dept_name) VALUES   
(301, 101, 'Physics'),  
(302, 101, 'Science'),  
(303, 102,  'Maths');

上面的查询将为表部门中的各个学生 ID 插入三个部门。

现在让我们删除父表中的一条记录。

DELETE FROM Student WHERE stu_id = 102; 

最终结果将删除表部门的第三条记录,因为其父表的引用被删除,使第三条记录悬空。

因此,它使用 on delete cascade 属性折叠第三条记录。该属性是参照完整性约束属性,当父表受到影响时,它会删除子表中的记录。