一对多关系的处理:
create table teacher(
id int primary key auto_increment,
name char(20),
gender char(10),
dept_id int);
teacher表
create table dept(
id int primary key auto_increment,
name char(10),
job char(30));
dept表
问题:
insert into teacher values(null,'xxx','name',1);
在老师表中的部门编号为1 但是1号部门不存在 所以该数据 不是一条完整数据
需要通过外键约束来保证数据只要能插入 一定是完整的数据
强调:如果要将两张表用外键关联起来 一定要区分表的主从关系
主表:部门表
从表:老师表
一定要先创建主表 在建从表
语法:
添加外键约束的语法
create table 表名称(一堆字段。。。。
foreign key(要设置为外键的字段) references 主表名称(主键字段));
案例:
部门表:
create table dept(
id int primary key auto_increment,
name char(10),
job char(30));
部门表
老师表:
create table teacher(
id int primary key auto_increment,
name char(20),
gender char(10),
dept_id int,
foreign key(dept_id) references dept(id));
老师表
总结外键的作用:
当我们把数据分到不同表中之后,相互就没有任何联系
如何才能保证数据完整,需要使用外键约束
外键约束的原理:
1.要先创建主表 再创建从表
2.从表插入数据时 必须保证外键的值已经存在主表中
3.删除表时 要先删除从表 再删除主表
4.当要删除主表中的记录时 要保证从表中没有记录 参照这个记录
5.主表更新时 如果要是更新主键 要保证从表没有记录参照着这一条记录
语法:
create table 名称(一堆字段,
foreign key(外键字段) references 主表(主键字段))
补充:
从表中外键字段通常是int类型 通常外键都要参照对方的主键
外键是一种 约束 是为了保证数据完整性
外键用于建立物理层级关联关系
在正常开发中不推荐使用 会降低存取效率
所以一般会把关系的维护交给应用程序 就是逻辑层面的关系
外键可以解决
多对一的关联关系
dept employe
一个部门对应多个员工 1 v n
多个员工对应一个部门 n v 1
上述关系成立 那么一定是多对1
在从表中增加一个字段用于关联主表的主键
存在外键关系后 增删改都受到了限制 操作起来较麻烦
mysql提供了一个级联关系
指的是 当主表发生改变 会同时操作从表
级联更新 主表更新了主键时 从表相应的更新外键的值
级联删除 主表删除了某一条记录 从表只只要外键与被删除的记录主键相同 则全部删除
员工表 id name gender dept_id
部门表 id name
create table dept(
id int primary key auto_increment,
name char(20));
create table emp(
id int primary key auto_increment,
name char(20),
gender char(20),
dept_id int,
foreign key(dept_id)reference dept(id));
dept表
设置级联的语法 在外键后面 + on delete cascade 和 on update cascade 可以捅死出现也可以单独使用
create table emp (
id int primary key auto-increment,
name char(20)
gender char(20),
dept_id int,
foreign key (dept_id)reference dept(id) on delete cascade on update cascade );
emp表
一对一关系的处理
案例:
客户表
create table customer (id int primary key auto_increment,
name char(20),
phone char(20),
address char(50));
insert into customer values(null,'xxx','110','上海');
insert into customer values(null,'yyy','120','北京');
客户表
学员表
create table student(id int primary key auto_increment,
name char(20),
class char(20),
subject char(20),
foreign key(id)reference customer(id));
insert into student values(1,'xxx','py','python');
insert into student values(2,'yyy','py','python');
学员表
一对一 关系不需要增加字段 直接把从表得主键设置为外键即可
通常一对一关系 是用来垂直分表的
多对多的关系
案例:
学生表
create table student(id int primary key auto_increment,
name char(20),
gender char(20));
学生表
老师表
create table teacher(id int primary key auto_increment,
name char(20),
gender char(20),
subject char(20));
老师表
关系表
create table t_s_r(id int primary key auto_increment,
s_id int not null,
t_id int not null,
foreign key(s_id)references student(id)
foreign key(t_id)references teacher(id)
unique (s_id,t_id));
关系表
需要先添加数据到 两个主表 学生和老师
insert into student values(1,'xxx','man');
insert into student values(2,'yyy','woman');
insert into teacher values(1,'sss','man','python');
insert into teacher values(2,'jjj','woman','linux');
#添加关系 数据
sss 教过 xxx
insert into t_s_r values(null,1,1);
添加数据
多对多的处理:
添加中间表 添加两个外键 分别关联不同的主表
为了保证数据不重复 需要给两个外键添加 联合唯一约束