三十五、表与表之间的关系
将所有数据都放在一张表内产生的弊端
1.表的组织结构不清晰 2.浪费存储空间 3.可扩展性极差(修改某个部门信息 )
多对一:
如何查找表与表之间的关系
以站在员工表为例:
多个员工能否属于一个部门 可以
以站在部门表为例:
多个部门能否有同一个员工 不可以
只有站在两边分析,才能下结论:
员工表单向多对一部门表
外键(foreign key )
1.必须先建被关联表 create table dep(id int primary key auto_increment, dep_name char(16), dep_desc char(64)); 2.外键关联 create table emp(id int primary key auto_increment,name char(6), gender enum('male','female','others') not null default 'male', # default 空格直接书写 dep_id int, foreign key(dep_id) references dep(id)); 3.插入数据 (1):先增加数据的时候,要先增被关联表中的数据 insert into dep(dep_name,dep_desc) values('外交部','形象代言人'), ('教学部','教书育人'), ('技术部','技术指导'); (2):再增加 insert into emp(name,gender,dep_id) values('jason','male',1), ('tank','male',2), ('engon','male',2), ('jerry','male',3);
修改emp表中的dep_id字段
update emp set dep_id=200 where id=1; 报错不能修改 update dep set id=100 where id =1; 报错不能修改 delete from dep where id=2; 报错不能删 delete from emp where id>1 and id<4; delete from dep where id=2; 这样就能修改了
#给外键字段新增功能 同步更新同步删除(级联删除,级联更新)
create table dep(id int primary key auto_increment, dep_name char(16), dep_desc char(64)); create table emp(id int primary key auto_increment,name char(6), gender enum('male','female','others') not null default 'male', # default 空格直接书写 dep_id int, foreign key(dep_id) references dep(id) on update cascade #同步更新 on delete cascade); #同步删除 修改: update dep set id=100 where id =1; delete from dep where id=2; #删掉部门后,对应员工表就删除了;修改部门后,员工对应号也进行修改;修改员工,报错
多对多:
例如:作者与图书 1.多个图书可能是一个作者写 2.多个作者写同一本书(之前作者死了) 这样就是 多对多 关系 3.确定关系后,作者与图书,分别被第三者关联,然后再对应关系 create table book(id int primary key auto_increment, title char(16), price int ); create table author(id int primary key auto_increment, name char(16), gender char(16) ); create table book2author( id int primary key auto_increment, book_id int, author_id int, foreign key(book_id) references book(id) on update cascade on delete cascade, foreign key(author_id) references author(id) on update cascade on delete cascade ); insert into book(title,price) values ('武大郎与潘金莲','30.99'), ('围城','50.66'), ('python','21000'); insert into author(name,gender) values ('json','male'), ('egon','female'), ('kevin','male'); insert into book2author(book_id,author_id) values (1,1), (1,2), (1,3), (2,1), (2,3), (3,1), (3,2);
一对一
客户表和学生表(老男孩的客户与学生之间关系,报名之前都是客户,只有报了名的才能是学生) 应用场景:比如:一张用户信息表分成两块,一块是用户名和密码,另一块是用户其他信息,这样在用户验证时候查找方便9速度快0 #左表的一条记录唯一对应右表的一条记录,反之也是一样 create table customer( id int primary key auto_increment, name char(20) not null, qq char(10) not null, phone char(16) not null ); create table student( id int primary key auto_increment, class_name char(20) not null, customer_id int unique, #关联该字段一定要唯一 foreign key(customer_id) references customer(id) #外键的字段一定要保证unique on delete cascade on update cascade );
# 三种外键关系都是用foreign key,区别在于如何使用以及其他条件限制即可做出三种关系
总结:
书籍和作者
一本书可不可以被多个作者写 可以
一个作则可不可以写多本书 可以
多对多
书籍和出版社
一本书籍可不可以被多个出版社出版 不可以
一个出版社可不可以出版多本书 可以
一对多
作者与作者详情表
两个不可以就是一对一
一对一
了解知识点:
1. 修改表名 alter table 表名 rename 新表名; 2. 增加字段 alter table 表名 add 字段名 数据类型 [完整性约束条件…], add 字段名 数据类型 [完整性约束条件…]; alter table 表名 add 字段名 数据类型 [完整性约束条件…] first; # 直接移到最前面 alter table 表名 add 字段名 数据类型 [完整性约束条件…] after 字段名; # 寻找插哪个字段的后面 3. 删除字段 alter table 表名 drop 字段名; 4. 修改字段 # modify只能改字段数据类型完整约束,不能改字段名,但是change可以! alter table 表名 modify 字段名 数据类型 [完整性约束条件…]; alter table 表名 change 旧字段名 新字段名 新数据类型 [完整性约束条件…];
# 复制表结构+记录 (key不会复制: 主键、外键和索引) create table new_service select * from service; # 查询语句执行的结果也是一张表,可以看成虚拟表 # 只复制表结构 select * from service where 1=2; //条件为假,查不到任何记录 create table new1_service select * from service where 1=2; create table t4 like employees;