MySQL中“键”和“索引”的定义相同,所以外键和主键一样也是索引的一种。
不同的是MySQL会自动为所有表的主键进行索引,但是外键字段必须由用户进行明确的索引。
两个表必须是InnoDB表,MyISAM表暂时不支持外键
外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显式建立;
外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以;
为什么要用外键:
保持数据的一致性完整性。
外键的实际用处:
1.去除数据库垃圾数据
2.连带更新
举例:
部门表: department
班级表 :
学生表: student
department(主表)
id name
1 艺术系
2 舞蹈系
3 音乐系
(从表)
id name did
1 一班 1
2 三班 2
3 二班 3
student(从表)
id name cid
1 小周 1
2 小王 2
3 小李 3
外键一定是在从表中创建,从而找到与主表之间的联系;从表负责维护二者之间的关系。
创建外键:
班级表对应部门表
-> add constraint class_id
-> foreign key(did)
-> references department(id)
-> on delete cascade
-> on update cascade;
alter table student
-> add constraint stu_id
-> foreign key(cid)
-> references classes(id)
-> on delete cascade
-> on update cascade;
关键字 含义
CASCADE 删除包含与已删除键值有参照关系的所有记录
SET NULL 修改包含与已删除键值有参照关系的所有记录,使用NULL值替换(只能用于已标记为NOT NULL的字段)
RESTRICT 拒绝删除要求,直到使用删除键值的辅助表被手工删除,并且没有参照时(这是默认设置,也是最安全的设置)
NO ACTION 啥也不做
操作:
当删除部门表中的一条数据的时候,班级表里面对应的部门表的数据都会被删除,同理学生表对应班级表中的数据也可以被删除