MySQL ON DELETE CASCADE(级联删除)[猿教程]

  • Post author:
  • Post category:mysql


转载地址:

MySQL ON DELETE CASCADE(级联删除)|猿教程|

在本教程中,您将学习如何使用 MySQL 的

ON DELETE CASCADE

外键引用操作从多个相关表中删除数据。

在上一教程中,您学习了如何使用单个

DELETE

语句从多个相关表中删除数据。但是,MySQL 为外键提供了一种更有效的方法,称为

ON DELETE CASCADE

引用操作,允许您在从父表中删除数据时自动从子表中删除数据。

MySQL ON DELETE CASCADE 示例

让我们看一个使用 MySQL ON DELETE CASCADE 的例子。

假设我们有两张表:

buildings



rooms

。在这个数据库模型中,每栋建筑都有一个或多个房间。然而,每个房间只属于一栋建筑。没有建筑物,房间就不会存在。


buildings



rooms

表之间的关系是一对多

(1:N)

,如下面的数据库图所示:

当您从

building

表中删除一行时,您还希望删除

rooms

表中引用

building

表中的行的所有行。例如,当您删除具有建筑物编号的行时。 2在

buildings

表中作为以下查询:

DELETE FROM buildings 
WHERE building_no = 2;

您还希望

rooms

表中引用 2 号楼的行也将被删除。

以下是演示

ON DELETE CASCADE

引用操作如何工作的步骤。

步骤 1. 创建

building

表:

CREATE TABLE buildings (
    building_no INT PRIMARY KEY AUTO_INCREMENT,
    building_name VARCHAR(255) NOT NULL,
    address VARCHAR(255) NOT NULL
);

步骤 2. 创建

rooms

表:

CREATE TABLE rooms (
    room_no INT PRIMARY KEY AUTO_INCREMENT,
    room_name VARCHAR(255) NOT NULL,
    building_no INT NOT NULL,
    FOREIGN KEY (building_no)
        REFERENCES buildings (building_no)
        ON DELETE CASCADE
);

请注意,外键约束定义末尾的

ON DELETE CASCADE

子句。

步骤 3. 将行插入到

buildings

表中:

INSERT INTO buildings(building_name,address)
VALUES('ACME Headquaters','3950 North 1st Street CA 95134'),
      ('ACME Sales','5000 North 1st Street CA 95134');

步骤 4. 从

buildings

表中查询数据:

SELECT * FROM buildings;

步骤 5. 在

rooms

表中插入行:

INSERT INTO rooms(room_name,building_no)
VALUES('Amazon',1),
      ('War Room',1),
      ('Office of CEO',1),
      ('Marketing',2),
      ('Showroom',2);

步骤 6. 从

rooms

表中查询数据:

SELECT * FROM rooms;

我们有三个房间属于 1 号楼,两个房间属于 2 号楼。

步骤 7. 删除建筑物编号2的建筑物。

DELETE FROM buildings 
WHERE building_no = 2;

步骤 8. 从

rooms

表中查询数据:

SELECT * FROM rooms;

如您所见,所有引用

building_no

2 的行都被自动删除。

请注意,

ON DELETE CASCADE

仅适用于具有支持外键的存储引擎的表,例如

InnoDB

某些表类型不支持 MyISAM 等外键,因此您应该为计划使用 MySQL ON DELETE CASCADE 引用操作的表选择合适的存储引擎。

查找受 MySQL ON DELETE CASCADE 操作影响的表的提示

有时,当您从表中删除数据时,了解

ON DELETE CASCADE

引用操作会影响哪个表很有用。您可以从

information_schema

数据库中的

referential_constraints

查询此数据,如下所示:

USE information_schema;

SELECT 
    table_name
FROM
    referential_constraints
WHERE
    constraint_schema = 'database_name'
        AND referenced_table_name = 'parent_table'
        AND delete_rule = 'CASCADE'

例如,要在

classicmodels

数据库中使用

CASCADE

删除规则查找与

building

表关联的表,请使用以下查询:

USE information_schema;

SELECT 
    table_name
FROM
    referential_constraints
WHERE
    constraint_schema = 'classicmodels'
        AND referenced_table_name = 'buildings'
        AND delete_rule = 'CASCADE'

在本教程中,您学习了如何使用 MySQL

ON DELETE CASCADE

外键引用操作,以便在您从父表中删除数据时自动从子表中删除数据。



版权声明:本文为hj_5346原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。