MySQL 级联删除
在 MySQL 语言中,约束是指在表上强制执行以避免某些异常的一组规则。
这些异常会导致表中出现错误记录。基于故障的行为,约束可以是各种类型。
它们是参照完整性、实体约束和语义约束。这些具有基于故障类型以及如何避免不一致行为的含义和用法。
让我们简要了解存在的约束类型。
- 实体约束是应用于表中存在的实体和属性的约束。
它保持表列中显示的值的一致性。它通常被称为第一级验证,其中保持了列的完整性。
例子:
createtablestudent(stu_idintprimarykey,stu_namevarchar2(50),stu_deptvarchar2(15));Insertintostudentvalues(111,'ABC','Chemical');
主键
是实体完整性约束,它在内部意味着stu_id
列是唯一且非空值。stu_id 列
中不允许重复,并且不允许非空值。 - 语义约束在列上强制执行,以显示表中存在的相似数据类型值。它通常在列上强制执行以使值一致并保持特定类型。
例子:
Stu_namevarchar2(50);
在上面的示例中,
varchar2
是容量为 50 字节的数据类型,用于保存学生姓名。该列仅保留字符类型的值,不允许使用双精度值和整数值。因此,它是一种语义约束。
- 参照完整性是应用于其他表以对数据实施限制的约束。最常用的约束是外键约束。
如果父表有修改,子表应与父表保持一致。如果是删除记录的情况,则子记录中的引用不应保持悬空,并且是引用完整性约束。
例子:
createtablereport_card(stu_roll_numberint,stu_marksint,stu_coursevarchar2(30)referencesstudent);
在上面的示例中,成绩单显示了父表 student 中学生的部门或课程。如果引用完整性约束被应用,那么一个表中的操作将影响子表中的工作。
在参照完整性约束下,on delete cascade
是参照完整性约束,如果父记录被删除,它会自动删除子记录。它是对从外键采取的引用动作的响应。
例子:
CREATETABLEStudent(stu_idint(10)NOTNULL,namevarchar(10)NOTNULL,birthdatedateNOTNULL,PRIMARYKEY(stu_id));
上面的查询创建了一个表 student,其属性或列作为学生 ID,int
类型和主键作为列的实体约束。其他值属性包括名称和生日,其数据类型为 varchar
和 date
。
CREATETABLEDepartment(dept_idint(20)PRIMARYKEYNOTNULL,stu_idint(10)NOTNULL,dept_namevarchar(20)NOTNULL,FOREIGNKEY(stu_id)REFERENCESStudent(stu_id)ONDELETECASCADE);
在上面的查询中,形成了一个部门表,其属性为 id、部门名称和学生 id。此外,学生 ID 将充当父表中的引用或外键。
这里的 on delete cascade
约束说,当学生 id 发生任何删除时,它从部门表中的条目也将被删除。因此,删除后不会有与该系学生对应的条目。
让我们在表中插入记录,看看这里的操作是如何工作的。
首先,在表 Student
中插入记录。
INSERTINTOStudent(stu_id,name,birthdate)VALUES(101,'John','1995-11-12'),(102,'Jian','1983-07-19'),(103,'Jackey','1965-10-23');
上面的查询将在表 Student
中插入三条记录。
在表部门
中插入记录。
INSERTINTODepartment(dept_id,stu_id,dept_name)VALUES(301,101,'Physics'),(302,101,'Science'),(303,102,'Maths');
上面的查询将为表部门中的各个学生 ID 插入三个部门。
现在让我们删除父表中的一条记录。
DELETEFROMStudentWHEREstu_id=102;
最终结果将删除表部门的第三条记录,因为其父表的引用被删除,使第三条记录悬空。
因此,它使用 on delete cascade
属性折叠第三条记录。该属性是参照完整性约束属性,当父表受到影响时,它会删除子表中的记录。