MySQL外键约束
外键
外键是用于建立两个表数据之间的连接,使用外键表示一个表中的一个字段被另一个表中的一个字段引用。
外键关系
外键的关系一共三种:
- 一对多:表t1的某个字段值可以对应多个表t2的某个字段值;比如一个班级可以对应多个学生。
- 多对多:表t1的字段值可以对应多个表B的字段值,并且表B的字段值也可以对应多个表A的字段值;比如一个老师可以教多个班级,一个班级也可以有多个老师教。
- 一对一:表t1的某个字段值只能对应一个表t2的某个字段值;比如用户账户表和用户信息表,用户账户存储账号密码,用户信息表存储用户信息。
外键创建
创建外键语法:
foreign key(外键字段) references 主键表(主键字段)
举例:创建学生与班级的关联关系
# 优先创建被关联表班级class
create table class(
cid int primary key auto_increment,
cla_name varchar(255)
);
# 创建外键关联表学生student
create table student(
sid int primary key auto_increment,
stu_name varchar(255),
cid int,
foreign key(cid) references class(cid)
);
外键的约束效果
1.创建表的时候,应该先创建被关联表(没有外键字段的表)。
2.添加数据的时候,应该先添加被关联表(没有外键字段的表)的数据。
3.外键字段添加的值只能是被关联表中已经存在的值。
3.修改、删除被关联表的数据都会出现障碍,需要优先修改、删除外键字段的值。
级联更新级联删除
因为在修改、删除被关联表的数据会出现障碍,所以我们可以在添加外键字段时设置级联更新和级联删除来同时修改或删除外键字段和主键字段的数据。
级联更新:
foreign key(外键字段) references 主键表(主键字段) on update cascade
级联删除:
foreign key(外键字段) references 主键表(主键字段) on delete cascade
同时设置级联更新、级联删除:
foreign key(外键字段) references 主键表(主键字段) on update cascade on delete cascade
多对多关系
两张表之间如果是多对多关系,是无法互相建立外键的,这时需要单独创建第三张表用于存储关系。
比如班级表和教师表之间的关系是多对多关系:一个班级有多个教师讲课,一个教师会在多个班级讲课。
# 创建班级表class
create table class(
cid int primary key auto_increment,
c_name varchar(32)
);
insert into class(c_name) value('高一(1)'),('高一(2)'),('高一(3)');
# 创建教师表
create table teacher(
tid int primary key auto_increment,
t_name varchar(32)
);
insert into teacher(t_name) value('jack'),('jason'),('mike');
# 第三张表:关系表
create table class_teacher(
cid int,
tid int,
foreign key(cid) references class(cid)
on update cascade on delete cascade,
foreign key(tid) references teacher(tid)
on update cascade on delete cascade
);
insert into class_teacher value(1,2),(1,1),(2,3),(3,1);
一对一关系
有时数据库为了节省资源并降低数据库压力,会将一个表一分为二,对这两个表建立一对一关系。
对于两个一对一关系的表,外键字段建在任意一方都可以,但是推荐建在查询频率较高的一方。
比如用户表一分为二,建立用户账号表和用户信息表,外键字段可以建立在用户账号表。
# 用户信息表
create table user_info(
uid int primary key auto_increment,
age int,
birthday date,
email varchar(32),
address varchar(32)
);
# 用户账号表
create table user_account(
uid int unique, # 添加外键字段唯一
username varchar(32),
password varchar(32),
foreign key(uid) references user_info(uid)
on update cascade on delete cascade
);