外键描述
- 如果一张表中有一个非主键的字段指向了另一张表中的主键,就将该字段叫做外键;
- 外键可以是一对一的,一个表的一个字段只能与另一个表的一条记录连接;或者是一对多的,一个表的一个字段与另一个表的多条记录连接;或者是多对多的,一个表的多个字段与多个表的记录连接。
使用条件
- 两个表必须是InnoDB表,MyISAM表暂时不支持外键(注:InnoDB与MyISAM);
- 外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显式建立;
- 外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以。
作用
- 可以使得两张表关联,保证数据的一致性和、完整性。
阻止执行
- 从表插入新行,其外键值不是主表的主键值便阻止插入;
- 从表修改外键值,新值不是主表的主键值便阻止修改;
- 主表删除行,其主键值在从表里存在便阻止删除(要想删除,必须先删除从表的相关行);
- 主表修改主键值,旧值在从表里存在便阻止修改(要想修改,必须先删除从表的相关行)。
级联执行
- 主表删除行,连带从表的相关行一起删除;
- 主表修改主键值,连带从表相关行的外键值一起修改。
创建外键
[constraint 约束名] foreign key(字段名) references 主表名(主键名)
[on delete restrict | cascade | set null | no action | set default]
[on update restrict | cascade | set null | no action | set default]
# 示例
create table tbl_score(
id int primary key auto_increment,
course varchar(16),
stu_id int,
constraint c_stu_id foreign key(stu_id) references tbl_stu(id),
score int default 0
);
alter table tbl_score add constraint c_stu_id foreign key(stu_id) references tbl_stu(id);
- 该语法可以在 create table 和 alter table 时使用;
- constraint [约束名]:选填,不填则MySQL会自动生成一个名字,可以根据这个名称删除约束;
- foreign key(字段名),这个字段名需要是存在的;
- on delete、on update表示事件触发限制,选填参数:
- restrict :限制外表中的外键改动,默认值;
- cascade : 跟随外键改动;
- set null: 设空值;
- no action:无动作,默认的;
- set default:设默认值;
知识总结,交流学习,不当之处敬请指正,谢谢!