01.一对多表关系
[toc]{type: “ol”, level: [2, 3, 4, 5]}
一对多表关系[同时成立]
员工表的一个员工,不能对应部门表的多个部门
部分表的一个部门,可以对应员工表的多个员工
优先创建被关联表
create table dep(
id int primary key auto_increment,
dep_name char(16),
dep_desc char(32)
);
create table em(
id int primary key auto_increment,
name char(16),
gender enum('male', 'female') default 'male',
dep_id int,
# 建立关系 关联字段 被关联字段
foreign key(dep_id) references dep(id)
# 级联更新 级联删除
on update cascade on delete cascade
);
--优先录入被关联表的数据
insert into dep(dep_name,dep_desc) values('技术部','技术能力有限'),('外交部','外交能力很强');
insert into em(name,dep_id) values('lili',2),('lisa',1),('rose',2);
02.多对多表关系
[toc]{type: “ol”, level: [2, 3, 4, 5]}
多对多的表关系[同时成立]:
书籍表的一本书,可以对应作者表的多个作者
作者表的一个作者,可以对应书籍表的多本书
::: tip
需要单独开设一张表,专门用来存储两张表之间的数据关系
:::
::: tip
书籍表的book_name与新建表的book_id是1对多的关系
:::
::: tip
作者表的author_name与新建表的author_id是1对多的关系
:::
创建表单
create table book(
id int primary key auto_increment,
book_name char(32),
price int
);
create table author(
id int primary key auto_increment,
name char(32),
age int
);
-- 建立关联
create table book_author(
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
);
03.一对一表关系
[toc]{type: “ol”, level: [2, 3, 4, 5]}
一对一的表关系[同时成立]:
用户表的一组数据,不能对应详情表的多组数据
详情表的一组数据,不能对应用户表的多组数据
::: tip
如果一个表的数据特别多,但是不是每次查询都需要所有数据,就可以将表一分为二
:::
用户表
id name age
详情表
addr phone hobby email…
创建表单
--关系字段推荐建立在查询频率高的表中
create table user_desc(
id int primary key auto_increment,
addr char(32),
phone int,
hobby char(32),
email char(32)
);
create table user(
id int primary key auto_increment,
name char(16),
age int,
user_desc_id int unique,
foreign key(user_desc_id) references user_desc(id) on update cascade on delete cascade
);
04.修改表与复制表
[toc]{type: “ol”, level: [2, 3, 4, 5]}
修改表:
修改表名:
alter table 愿表名 rename 新表名;
增加字段:
alter table 表名 add 字段名 字段类型(宽度) 约束条件 (first / after);
删除字段:
alter table 表名 drop 字段名;
修改字段:
alter table 表名 modify 字段名 字段类型(宽度) 约束条件;
alter table 表名 change 原字段名 新字段名 字段类型(宽度) 约束条件;
复制表:
create table 新表名 select * from 原表名; --> 不能复制键及索引,只能复制数据