典型回答 MySQL 外键(Foreign Key)是用于建立表之间关系的,它定义了一个表中的一列或一组列,这些列的值必须在另一个表的主键列中存在。
MySQL 外键最大的作用就是有助于维护数据的一致性和完整性。
一致性:如果一个订单表引用了一个客户表的外键,外键可以确保订单的客户 ID 存在于客户表中,从而保持数据的一致性。 完整性:外键可以防止在引用表中删除正在被其他表引用的记录,从而维护数据的完整性。 但是,其实在很多大型互联网公司中,很少用外键的,甚至阿里巴巴Java开发手册中明确规定了:
【强制】不得使用外键与级联,一切外键概念必须在应用层解决。
说明: 以学生和成绩的关系为例,学生表中的 student_id 是主键,那么成绩表中的 student_id 则为外键。如果更新学生表中的 student_id,同时触发成绩表中的 student_id 更新,即为级联更新。外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。
那么,使用外键会带来哪些问题呢?
先举个例子,我们有两张表:Orders(订单)和 OrderItems(订单项)。这两个表之间通过外键建立关系,订单项表中的外键引用订单表的订单号。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 CREATE TABLE Orders ( OrderID INT PRIMARY KEY, CustomerID INT, OrderDate DATE, -- 其他订单信息 ); CREATE TABLE OrderItems ( ItemID INT PRIMARY KEY, OrderID INT, ProductID INT, Quantity INT, -- 其他订单项信息 FOREIGN KEY (OrderID) REFERENCES Orders(OrderID) ); 接下来基于这两张表展开分析,
...