MySQL 级联删除

Rashmi Patidar 2022年5月13日
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 字节的数据类型,用于保存学生姓名。

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

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

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

    例子:

    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 属性折叠第三条记录。该属性是参照完整性约束属性,当父表受到影响时,它会删除子表中的记录。

作者: Rashmi Patidar
Rashmi Patidar avatar Rashmi Patidar avatar

Rashmi is a professional Software Developer with hands on over varied tech stack. She has been working on Java, Springboot, Microservices, Typescript, MySQL, Graphql and more. She loves to spread knowledge via her writings. She is keen taking up new things and adopt in her career.

LinkedIn

相关文章 - MySQL Delete