简介
MySQL的外键约束用来在两个表数据之间建立链接,其中一张表的一个字段被另一张表中对应的字段约束。也就是说,设置外键约束至少要有两种表,被约束的表叫做从表(子表),另一张叫做主表(父表),属于主从关系。
表格说明
现在有两张表my_class(主表)、my_stu(从表),主表与从表通过id连接。
创建表的sql语句:
#主表
CREATE table my_class(
id int PRIMARY KEY,
`name` VARCHAR(32) not null
)
#从表
CREATE table my_stu(
id int PRIMARY KEY,
`name` VARCHAR(32),
class_id int ,
foreign key(class_id) REFERENCES my_class(id)
)
外键是怎么来体现约束的呢?
1.从表插入数据时,主表中一定要有对应的外键。
my_class表(主表):
id(主键) | name |
---|---|
1 | 小班 |
2 | 中班 |
3 | 大班 |
insert into my_stu(id,name,class_id) values(1,"小花",4); #错误,class_id=4在主表中找不到对应的id=4
insert into my_stu(id,name,class_id) values(1,"小花",3); #正确,符合外键约束规范,主表中存在id=3
2.主表数据删除时,一定要确保从表中没有与删除数据相关联的数据。
比如现在存在my_stu表:
id(主键) | name | class_id(外键) |
---|---|---|
1 | 小花 | 1 |
2 | 小红 | 2 |
3 | 小张 | 3 |
因为从表中存在(1,小花,1),所以下面的删除会报错。
delete from my_class where id=1; #错误
应当先删除从表中关联数据,再删除主表中的数据。
delete from my_stu where class_id=1;#删除从表关联数据
delete from my_class where id=1;
注意事项
- 外键指向的主表字段要求是primary key或unique
- 表必须为innodb,才支持外键
- 外键与主键类型需一致
- 外键可以为null,为null时主表中可以不存在对应的null。