一、基本概念
1、MySQL中“键”和“索引”的定义相同,所以外键和主键一样也是索引的一种。不同的是MySQL会自动为所有表的主键进行索引,但是外键字段必须由用户进行明确的索引。用于外键关系的字段必须在所有的参照表中进行明确地索引,InnoDB不能自动地创建索引。
2、外键可以是一对一的,一个表的记录只能与另一个表的一条记录连接,或者是一对多的,一个表的记录与另一个表的多条记录连接。
3、如果需要更好的性能,并且不需要完整性检查,可以选择使用MyISAM表类型,如果想要在MySQL中根据参照完整性来建立表并且希望在此基础上保持良好的性能,最好选择表结构为innoDB类型。
4、外键的使用条件
① 两个表必须是InnoDB表,MyISAM表暂时不支持外键
② 外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显式建立;
③ 外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以;
5、外键的好处:可以使得两张表关联,保证数据的一致性和实现一些级联操作。保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值!可以使得两张表关联,保证数据的一致性和实现一些级联操作;
外键的优缺点(不用外键的原因)
优点:
设置外键可以保证数据的完整性与关联性,杜绝数据冗余
级联操作方便,比如涉及一个离职用户的所有相关信息,可以直接删除这个用户就能做到所有信息一起删除的操作
缺点:
主表进行修改或变更,会波及一大片从表,顿时会使公司部分业务处于不可用的状态,不利中小公司的设计,一般中小型公司都没有dba,开发人员对数据库了解的不够深,容易误操作,所以建议不用使用过多的外键来操作相关业务表
而且对于insert, update, delete等操作时都会先检查外键的约束条件再操作,性能有所下降
不用外键时
可以用触发器或应用程序保证数据的完整性
开发变得简单,维护数据时不用考虑外键约束
数据管理简单,操作方便,性能高(导入导出等操作,在insert, update, delete 数据的时候更快)eg:在海量的数据库中想都不要去想外键,试想,一个程序每天要insert数百万条记录,当存在外键约束的时候,每次要去扫描此记录是否合格,一般还不止一个字段有外键,这样扫描的数量是成级数的增长!