mysql 删除主表数据同时删除子表数据
在数据库中,通常会存在主表和子表的关系,例如订单表和订单详情表。当我们需要删除主表中的数据时,同时也需要删除对应的子表数据,以保持数据的一致性和完整性。本文将详细介绍在MySQL中如何删除主表数据同时删除子表数据。
设计数据库表结构
在进行操作之前,首先需要设计数据库表结构。我们以订单表和订单详情表为例,创建以下两张表:
订单表(orders)
字段名 | 类型 | 描述 |
---|---|---|
id | int | 主键 |
order_no | varchar(20) | 订单号 |
create_time | datetime | 创建时间 |
total_price | decimal(10,2) | 订单总价 |
订单详情表(order_details)
字段名 | 类型 | 描述 |
---|---|---|
id | int | 主键 |
order_id | int | 订单ID (外键) |
product_id | int | 商品ID |
quantity | int | 商品数量 |
price | decimal(10,2) | 商品单价 |
创建数据库表
在MySQL中创建上述两张表:
CREATE TABLE orders (
id INT PRIMARY KEY,
order_no VARCHAR(20),
create_time DATETIME,
total_price DECIMAL(10,2)
);
CREATE TABLE order_details (
id INT PRIMARY KEY,
order_id INT,
product_id INT,
quantity INT,
price DECIMAL(10,2),
FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE
);
在order_details
表中,我们设置了外键order_id
引用orders
表的id
字段,并且设置了ON DELETE CASCADE
,表示当主表的数据被删除时,对应的子表数据也会被自动删除。
删除主表数据同时删除子表数据
下面以实际案例演示如何在MySQL中删除主表数据同时删除子表数据。
添加示例数据
首先往orders
表和order_details
表中插入一些示例数据:
INSERT INTO orders (id, order_no, create_time, total_price) VALUES (1, '20220101001', '2022-01-01 10:00:00', 100.00);
INSERT INTO orders (id, order_no, create_time, total_price) VALUES (2, '20220102001', '2022-01-02 11:00:00', 200.00);
INSERT INTO order_details (id, order_id, product_id, quantity, price) VALUES (1, 1, 1, 2, 50.00);
INSERT INTO order_details (id, order_id, product_id, quantity, price) VALUES (2, 1, 2, 3, 20.00);
INSERT INTO order_details (id, order_id, product_id, quantity, price) VALUES (3, 2, 1, 1, 100.00);
删除主表数据同时删除子表数据
现在我们来删除orders
表中id
为1的订单数据,同时也会删除order_details
表中对应的订单详情数据:
DELETE FROM orders WHERE id = 1;
删除后,查看order_details
表:
SELECT * FROM order_details;
结果应该为:
| id | order_id | product_id | quantity | price |
|----|----------|------------|----------|-------|
| 3 | 2 | 1 | 1 | 100.00 |
从结果可以看出,order_details
表中与order_id
为1的订单数据已经被删除。
总结
在MySQL中,我们可以通过设置外键关联以及ON DELETE CASCADE
来实现删除主表数据时同时删除子表数据的操作。这样可以确保数据库中的数据一致性和完整性,避免出现脏数据。在设计数据库表结构时,务必考虑到这一点,合理设置外键关联和约束条件,以便更好地管理数据。