将所有数据都放在一张表内产生的弊端
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;
复制表结构+记录