关于Mysql外键ForeignKey

211 阅读1分钟

FK关联的类型

  • CASCADE:父表delete、update的时候,子表会delete、update掉关联记录;

  • SET NULL:父表delete、update的时候,子表会将关联记录的外键字段所在列设为null,所以注意在设计子表时外键不能设为not null;

  • RESTRICT:如果想要删除父表的记录时,而在子表中有关联该父表的记录,则不允许删除父表中的记录;

  • NO ACTION:同 RESTRICT,也是首先先检查外键;

  • Set default:父表有变更时,子表将外键列设置成一个默认的值 但Innodb不能识别

缺点

  • 目前,在 MySQL 内置存储引擎中,只剩下 InnoDB 还在支持外键,因此如果要使用外键可选择的存储引擎不多。

  • 外键导致查询需要依赖其他数据表,这意味着 InnoDB 需要在父级表(或相关表)中检验相应的值。这也会锁定父级表的数据行,以保证在事务完成前该行不会被删除。这会导致意外的锁等待,甚至是死锁,这类问题很难被定位。

推荐方法

  • 使用触发器替代外键。events或者hooks。
  • 在应用层application layer操作。

结论

从众多互联网企业的数据库设计规范来看,外键是一再被重申要被禁用的。 (验证大名鼎鼎的bbs(Discourse)没有外键。

  • 不单单是性能问题,而且互联网的业务多变,如果是表结构发生变动,很可能会导致外键关联的表出现意想不到的问题。
  • 因此,在非必要的情况下不要用外键,除非你只是为了验证外键的功能。