所有数据在一张表中导致: 组织结构不清晰,扩展性差,浪费空间
foreign key 外键是一种约束,约束两张表的关系
约束1:创建表 先建立被关联表,才能建关联表
约束2:查数据 被关联表先插入数据,关联表才能插入数据
约束3:删数据 先删除关联表中的数据,才能删被关联表的数据
约束4:不能改关联字段
级联: 同步更新,同步删除
on update cascade # 同步更新
on delete cascade # 同步删除
注: 级联是绑定给外键的
1)cascade方式
在父表上update/delete记录时,同步update/delete掉子表的匹配记录
2)set null方式
在父表上update/delete记录时,将子表上匹配记录的列设为null
要注意子表的外键列不能为not null
3)No action方式
如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作
4)Restrict方式
同no action, 都是立即检查外键约束
5)Set default方式
父表有变更时,子表将外键列设置成一个默认的值 但Innodb不能识别
多对一:
外键健在'多'的那张表中
部门表:
create table dep(
id int primary key auto_increment,
dep_name char(16),
dep_comment char(64)
);
员工表
create table emp(
id int primary key auto_increment,
name char(16),
gender enum('male','female') not null default 'male',
dep_id int,
foreign key(dep_id) references dep(id)
on update cascade # 同步更新
on delete cascade # 同步删除
);
多对多:
外键健在第三张表中
create table author(
id int primary key auto_increment,
name varchar(20)
);
create table book(
id int primary key auto_increment,
name char(16),
price int
);
# 创建第三张表
create table author2book(
id int not null unique auto_increment,
author_id int not null,
book_id int not null,
fk_author foreign key(author_id) references author(id) on delete cascade on update cascade,
fk_book foreign key(book_id) references book(id) on delete cascade on update cascade,
primary key(author_id,book_id)
);
一对一
# 创建一对一关联表 外键放在被频繁查询的表中并且外键为单列唯一
create table customer(
id int primary key auto_increment,
name varchar(64) not null,
qq int not null,
phone int not null
);
create into student(
id int primary key auto_increment,
name varchar(64) not null,
customer_id int unique, # 在一对一关联表中 此字段为唯一的
foreign key(customer_id) references customer(id)
on update cascade
on delete cascade
);