https://www.yiibai.com/mysql/foreign-key.html

https://www.yiibai.com/mysql/on-delete-cascade.html

假设有两张表:建筑物(buildings)和房间(rooms)。 在这个数据库模型中,每个建筑物都有一个或多个房间。 然而,每个房间只属于一个建筑物。没有建筑物则房间是不会存在的。

当我们从buildings表中删除一行时,还要删除rooms表中引用建筑物表中行的行。

我们希望rooms表中涉及到建筑物编号2的行记录也将被删除(讲得通俗一点:假设2号楼倒塌了,那么2号楼的房间应该也就不存在了)。以下是演示MySQL ON DELETE CASCADE参考操作如何工作的步骤。

1
2
3
4
5
6
7
8
9
10

USE testdb;
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
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

为何说外键有性能问题:1.数据库需要维护外键的内部管理;2.外键等于把数据的一致性事务实现,全部交给数据库服务器完成;3.有了外键,当做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,而不得不消耗资源;4.外键还会因为需要请求对其他表内部加锁而容易出现死锁情况;