- 主表:主键(primary key)用于与其它表相关联,并且作为在主表中的唯一性标识。主表就是被参考的,被依赖的
- 以主表的主键(primary key)值为外键 (Foreign Key)的表,可以通过外键与主表进行关联查询。从表与主表通过外键进行关联查询。从表就是参考别人,依赖别人的
- 举例,有一个学生信息表和专业信息表,其中学生信息表中的mid字段表示该学生的专业ID
- 所以专业信息表为主表,因为专业信息表中的mid字段被学生信息表所依赖
- 学生信息表为从表,因为学生信息表中的mid字段依赖于专业信息表
外键约束特点
- 一个表可以有很多个外键约束
- 外键约束是需要一个表的两个字段或两个表的两个字段之间建立外键约束
- 外键约束一定是在从表中建立的,举例中就是在员工表中建立
- 在从表中外键约束的列,与在主表中外键约束参考的列,这两个列的名称可以不同,但是意义、数据类型必须一致。
- 外键约束是同时约束双方的行为的
- 对于主表来说:修改和删除就受约束了,因为如果删除主表中的某一条记录,这个记录正好被从表依赖,那么从表就可能会发生变化
- 对于从表来说:添加和修改就受约束了,因为从表只能添加和修改主表中有的记录
- 主表被参考的字段/列必须是键列
- 建表时,先建主表,再建从表。删表时,先删从表,再删主表
约束等级
- 约束等级简单点说就是主表中的记录发生变化,从表中会怎么处理
- Cascade(级联)方式,主动权在主表上
- 如果主表被依赖字段修改了,从表对应的外键字段跟着修改
- 如果主表被依赖字段的记录删除了,从表对应的外键字段的记录也会删除
- Set null方式,主动权在主表上,需要注意的时要求外键字段必须不能有非空约束。
- 如果主表被依赖字段修改了,从表对应的外键字段设置为null
- 如果主表被依赖字段的记录删除了,从表对应的外键字段的值设置为null
- No action方式和Restrict方式
- 如果主表的被依赖字段的值被引用了,那么主表对该字段的修改和删除就被完全限制了。就不能修改和删除。
- 主表没有主动权。必须先处理从表对应的值,然后才能修改和删除。
创建外键约束
- 在建表时创建外键约束
create table 【数据库名.】从表名称(
字段名1 xxInt primary key auto_increment,
字段名2数据类型 【unique key】【not null】 default 默认值,
字段名3数据类型 default 默认值,
。。。。,
foreign key(从表的某字段) references 主表名(被参考字段) 【on update 等级】【on delete 等级】
);
- 建表后如何指定外键
alter table 【数据库名.】从表名称 add foreign key(从表的某字段) references 主表名(主表被引用字段) 【on update 等级】【on delete 等级】 ;
- 建表语句中【on update 等级】【on delete 等级】说明
- 【on update 等级】:设置更新数据时候的约束等级
- 【on delete 等级】:设置删除数据时候的约束等级
删除外键
- 通过drop约束名的方式删除外键
alter table 【数据库名.】从表名称 drop foreign key 约束名;
- 如何查看约束名
SELECT * FROM information_schema.table_constraints WHERE table_name = ‘表名称’;
外键约束练习
- 需求说明:创建部门表和员工表,部门表中的did字段被员工表依赖,在更新数据的时候将约束等级设置为级联,删除数据的时候将约束等级设置为set null方式
- 创建部门表(主表)
create table dept(
did int ,
dname varchar(20)
);
- 创建员工表(从表)
create table emp(
eid int primary key,
ename varchar(20),
did int,
foreign key(did) references dept(did) on update cascade on delete set null
);