📜  MySQL删除级联(1)

📅  最后修改于: 2023-12-03 14:44:31.653000             🧑  作者: Mango

MySQL删除级联

在MySQL中,级联删除是一项强大的功能,允许在父表中删除记录时自动删除关联的子表中的相关记录。本文将介绍如何使用MySQL进行级联删除。

开启级联删除

要使用级联删除功能,需要在建立关系的时候开启级联删除选项。例如,我们有一个orders表和一个order_items表,它们之间的关系是一个订单可以有多个订单项。我们可以使用以下SQL语句来创建这些表:

CREATE TABLE orders (
  id INT(11) NOT NULL AUTO_INCREMENT,
  customer_id INT(11) NOT NULL,
  order_date DATE NOT NULL,
  PRIMARY KEY (id),
  KEY customer_id (customer_id),
  FOREIGN KEY (customer_id) REFERENCES customers (id)
    ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE order_items (
  id INT(11) NOT NULL AUTO_INCREMENT,
  order_id INT(11) NOT NULL,
  product_id INT(11) NOT NULL,
  quantity INT(11) NOT NULL,
  PRIMARY KEY (id),
  KEY order_id (order_id),
  KEY product_id (product_id),
  FOREIGN KEY (order_id) REFERENCES orders (id)
    ON DELETE CASCADE,
  FOREIGN KEY (product_id) REFERENCES products (id)
    ON DELETE CASCADE
) ENGINE=InnoDB;

在上面的SQL语句中,我们在创建orders表时使用了ON DELETE CASCADE选项,表示在删除orders表中的记录时,将同时删除关联的order_items表中的记录。

示例

现在,我们来演示一下级联删除的使用方法。假设我们有一个订单,它有两个订单项。我们可以使用以下SQL语句来查询这个订单及其订单项:

SELECT *
FROM orders
JOIN order_items ON orders.id = order_items.order_id
WHERE orders.id = 1;

查询结果如下:

+----+-------------+------------+----+---------+------------+
| id | customer_id | order_date | id | order_id | product_id |
+----+-------------+------------+----+---------+------------+
|  1 |           1 | 2020-01-01 |  1 |       1 |          1 |
|  1 |           1 | 2020-01-01 |  2 |       1 |          2 |
+----+-------------+------------+----+---------+------------+

现在,我们想从orders表中删除这个订单记录并进行级联删除。我们可以使用以下SQL语句:

DELETE FROM orders WHERE id = 1;

执行这个SQL语句后,我们再次查询orders表和order_items表,可以发现与这个订单相关的订单项也已经被删除了:

SELECT * FROM orders;
+----+-------------+------------+
| id | customer_id | order_date |
+----+-------------+------------+
|  2 |           2 | 2020-02-01 |
+----+-------------+------------+

SELECT * FROM order_items;
+----+---------+------------+----------+
| id | order_id | product_id | quantity |
+----+---------+------------+----------+
|  3 |       2 |          3 |        10 |
+----+---------+------------+----------+
总结

级联删除是MySQL中非常有用的一项功能,可以在删除父表中的记录时同步删除关联的子表中的记录。使用级联删除需要在建立关系时开启级联删除选项。在实际应用中,要谨慎使用级联删除功能,以避免误删除数据。