外键约束
- 约束
约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性、唯一性 - 外键约束
建立表与表之间的某种约束关系,因为这种关系的存在,能够让表与表之间的数据,更加的完整,关联性更强
例:
# 创建部门表
create table dept (
id int primary key auto_increment,
dname varchar(50) not null);
# 创建人员表
create table person(
id int primary key auto_increment,
name varchar(32) not null,
age tinyint default 0,
sex enum('m','w','o') default 'o',
salary decimal(8,2) DEFAULT 250.00,
hire_date date NOT NULL,
dept_id int
);
在上面创建的员工表和部门表中。每个员工实际都有一个部门,如果在没有约束的情况下,人员是可以没有部门或者添加一个不存在的部门的。这样数据就会出现错误,此时,就应该添加外键约束,来保证数据的完整性和正确性。
foreign key 外键的定义语法:
# 该语法可以在 创建表 和 修改表 时使用
[constraint 外键名称] foreign key (外键字段)
references 主表表名(主表外键)
[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION}] # 级联动作,后续有写
[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION}]
- 主表和从表:若同一个数据库中,B表的外键与A表的主键相对应,则A表为主表,B表为从表。
则在上面创建的表中,部门表为主表,员工表为从表(员工表中的外键部门id与部门表中的主键id对应)。
# 创建表时之间建立外键
CREATE TABLE person (
id int PRIMARY KEY AUTO_INCREMENT,
name varchar(32) NOT NULL,
age tinyint DEFAULT 0,
sex enum('m','w','o') DEFAULT 'o',
salary decimal(10,2) DEFAULT 250.00,
hire_date date NOT NULL,
dept_id int ,
constraint dept_fk foreign key(dept_id) references dept(id);# 创建外键约束
# 建立表后增加外键
alter table person
add constraint dept_fk
foreign key(dept_id) references dept(id);
注意
- 并不是任何情况表关系都需要建立外键来约束
- 从表的外键字段数据类型与指定的主表的数据类型应该相同
- 解除外键约束
alter table person drop foreign key dept_fk # dept_fk为外键名
注意:
删除外键后发现desc查看索引标志还在,如下图,这是因为外键也是一种索引,需要将外键名称的索引删除后才可以。
- 级联动作:
概述:创建外键约束时设置主表与从表在删除或者更新时会产生的一系列操作
- restrict(默认)
on delete restrict:当主表删除记录时,如果从表中有相关的记录则不允许删除
on update restrict:当主表更改主键字段值时,如果从表中有相关的记录则不允许更改 - cascade 数据级联更新
on delete cascade, on update cascade:当主表删除记录或更改被参照字段的值是,从表会级联更新 - set null
on delete set null:当主表删除字段时,从表外键字段值变为null
on delete set null:当主表更改主键字段值时,从表外键字段值变为null - no action
同restrict,都是立即检查外键限制