欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MySQL外键

程序员文章站 2022-05-31 23:43:25
...

若一个实体的某字段指向另一实体的主键,此字段即为外键。被指向的实体叫作主表,负责在指向的实体叫做从表。
外键的作用用于约束处于关系内的实体,当增加从表记录时是否有与之对应的主表记录,若主表不存在对应记录则从表不能插入。

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能力限制,且不能轻易地水品扩展。

在数据库中核心表类似商品表尽量不要使用外键,若同步则肯定同步商品库,加入外键就无法通过,优化对它也没有作用。