若一个实体的某字段指向另一实体的主键,此字段即为外键。被指向的实体叫作主表,负责在指向的实体叫做从表。外键的作用用于约束处于关系内的实体,当增加从表记录时是否有与之对应的主表记录,若主表不存在对应记录则从表不能插入。
MySQL中MyISAM
和InnoDB
存储引擎都支持外键,但MyISAM
仅支持语法却不能实际实用。仅InnoDB
存储引擎可以使用外键约束,外键的好处在于两表关联,保证数据一致性并实现级联操作。
前提条件
- 两表必须为
InnoDB
存储引擎 - 使用在外键关系的域必须为索引类型
- 使用在外键关系的域必须与数据类型相似
创建外键
- 指定主键关键字
FOREIGN KEY(field)
- 引用外键关键字
REFERENCE tblname(fkname)
事件触发
ON DELETE
ON UPDATE
-
CASCADE
跟随外键改动 -
RESTRICT
限制外表中的外键改动 -
SET NULL
设置空值 -
SET DEFAULT
设置默认值
级联动作
-
CASCADE
关联操作,即主表被更新或删除从表也会执行对应操作。 -
SET NULL
从表数据不指向主表任何记录 -
RESTRICT
拒绝主表的相关操作
CREATE TABLE temp(
id int(11),
name char(20),
FOREIGN KEY(id) REFERENCES tblname(id) ON DELETE CASCADE ON UPDATE CASCADE
)
ALTER main_table ADD CONSTRAINT fk_main_sub FOREIGN KEY(sub_id) REFERENCES sub_table(id) ON DELETE SET NULL;
缺点
- 对MySQL优化时类似查询缓存、索引缓存之类的优化对
InnoDB
是不起作用的 - 对MySQL数据库整体架构中同步复制对
InnoDB
无效 - 外键使得表之间耦合加强
场景分析
- 外键是否采用看业务应用场景及开发成本而定
- 互联网行业应用不推荐使用外键,由于用户量大,并发度高,谓词数据库服务器很容易成为性能瓶颈,尤其受IO能力限制,且不能轻易地水品扩展。
- 在数据库中核心表类似商品表尽量不要使用外键,若同步则肯定同步商品库,加入外键就无法通过,优化对它也没有作用。