MySQL 多表之间的关系
多表之间的关系
1.分类:
- 一对一(了解):
* 如:人和身份证- 分析:一个人只有一个身份证,一个身份证只能对应一个人
- 一对多(多对一):
- 如:母亲和孩子
- 分析:一个母亲可以有多个孩子,一个孩子只能有一个母亲
- 多对多:
- 如:课程和学生
- 分析:一门课程能被很多个学生选,一个学生可以选很多门课程
2.实现关系:
- 一对多(多对一):
* 如:母亲和孩子
* 实现方式:在多的一方建立外键,指向一的一方的主键。- 多对多:
- 如:课程和学生
- 实现方式:多对多关系实现需要借助第三张中间表。中间表至少包含两个字段,这两个字段作为第三张表的外键,分别指向两张表的主键
- 一对一(了解):
- 如:人和身份证
- 实现方式:一对一关系实现,可以在任意一方添加唯一外键指向另一方的主键。
- 多对多:
3.一对多案例:
例如我们最熟悉的淘宝网,你打开淘宝首页,你会看到很多个分类,有服装,有电子产品,有食物等等,我们点开男装分类又会看到有T恤,卫衣,衬衫的分类,点开T恤你还能看到很多个商品,这就是一对多的案例。
-- 创建旅游线路分类表 tab_category
-- cid 商品分类主键,自动增长
-- cname 商品分类名称非空,唯一,字符串 100
create table tab_category (
cid int primary key auto_increment,
cname varchar(100) not null unique
)
INSERT INTO tab_category (cname) VALUES ('T恤'), ('衬衫'), ('卫衣');
SELECT * from tab_category;
delete from tab_category;
-- 创建分类后的商品表 tab_commodity
/*
id 商品主键,自动增长
name 商品名称非空,唯一,字符串 100
price 价格
cid 外键,所属分类
*/
create table tab_commodity(
id int primary key auto_increment,
name varchar(100) not null unique,
price double,
cid int,
foreign key (cid) references tab_category(cid)
)
-- 添加商品数据
INSERT INTO tab_commodity VALUES
(null,'T恤one',69,1),
(null,'衬衫two',98,3),
(null,'卫衣three',158,2);
SELECT * FROM tab_commodity;
4.多对多案例:
还是拿淘宝网来举例,一个商品可以被多个用户收藏,一个用户也可以收藏多个商品。
/*
创建用户表 tab_user
uid 用户主键,自增长
name 真实姓名长度 100
sex 性别,定长字符串 1
telephone 手机号,字符串 11
*/
create table tab_user (
uid int primary key auto_increment,
name varchar(100),
sex char(1) default '男', -- 没有赋值时默认为“男”
telephone varchar(11)
)
INSERT INTO tab_user VALUES
(NULL, '老王', '男', '12899998888'),
(NULL, '小王', '男', '13912344321');
select * from tab_user;
/*
创建收藏表 tab_favorite
id 商品 id,外键
date 收藏时间
uid 用户 id,外键
id 和 uid 不能重复,设置复合主键,同一个用户不能收藏同一个线路两次
*/
create table tab_favorite (
id int,
date date,
uid int, -- 创建复合主键
primary key(id,uid),
foreign key (id) references tab_commodity(id),
foreign key(uid) references tab_user(uid)
)
drop table tab_favorite;
-- 增加收藏表数据
INSERT INTO tab_favorite VALUES
(1, '2018-01-01', 1), -- 老王收藏了T恤one
(2, '2018-02-11', 1), -- 老王收藏了衬衫two
(1, '2018-04-21', 2), -- 小王收藏了T恤one
(3, '2018-05-08', 2); -- 小王选择卫衣three
select * from tab_favorite;
各表间的关系如图所示:
5.表与表之间的关系小结:
表与表的关系 | 关系的维护 |
---|---|
一对多 | 主外键的关系 |
多对多 | 中间表,两个一对多 |
1.特殊一对多,从表的外键设置为唯一。2.从表中的主键又是外键 |