1. 图书与出版社 一对多关系 图书是多 出版社是一
一个出版社能否对应多本图书 可以
一本图书能否对应多个出版社 不可以 版权问题
规律1:
有一个可以就是一对多
有两个可以就是多对多
两个都不可以,要么没关系,要么就是一对一
规律2:
一对多的情况下 外键字段建在多的一方
多对多的情况下 无需考虑 因为单独建一张表 里面放两个外键字段 分别关联两张表
一对一的情况下 建在任何一方都可以 推荐建在查询频率比较高的那张表中
建立表与表之间的硬性关系,在mysql中建立表关系统一用foreign key关键字
1. 必须先建被关联表
2. 插入数据的时候 应该先插被关联表的数据 这样才合理
3. 级联更新 级联删除
auto_increment只能修饰被设置成key的字段
key:
unique 递增肯定不唯一 所以可以用在unique
primary key 同上
外键不考虑
# 图书与出版社
# 多是图书为关联表 一是出版社为被关联表
# 建表的时候先建被关联表 再建关联表
# 插入数据的时候先插被关联表 才合理
# 外键字段建在多的一方(外键关联的必须是另一张表的主键或唯一键)
# 思考每张表有什么字段名
create table publish(
id int not null unique auto_increment,
name varchar(32),
addr varchar(32)
);
create table book(
id int primary key auto_increment,
title char(32),
price char(32),
# 创建外键字段 外键字段通常是和另一张表id字段关联 起名字尽量
publish_id int unique,
# 关联的必须是主键或唯一键 references后写publish_id是错误的
foreign key(publish_id) references publish(id)
on update cascade # 同步更新
on delete cascade # 同步删除
);
# 插入表数据
insert into publish(name,addr) values
('电子工业出版社','天津'),
('北京出版社','北京'),
('上海出版社','上海'),
('航天出版社','酒泉')
;
# 再插关联表
insert into book(title,price) values
('MySQL必知必会',67),
('python从入门到放弃','56'),
('带你玩转Linux','89')
;
mysql> select * from book;
+----+--------------------------+-------+------------+
| id | title | price | publish_id |
+----+--------------------------+-------+------------+
| 1 | MySQL必知必会 | 67 | NULL |
| 2 | python从入门到放弃 | 56 | NULL |
| 3 | 带你玩转Linux | 89 | NULL |
+----+--------------------------+-------+------------+
mysql> select * from publish;
+----+-----------------------+--------+
| id | name | addr |
+----+-----------------------+--------+
| 1 | 电子工业出版社 | 天津 |
| 2 | 北京出版社 | 北京 |
| 3 | 上海出版社 | 上海 |
| 4 | 航天出版社 | 酒泉 |
+----+-----------------------+--------+
#2. 图书与作者 多对多关系
一个作者能否对应多本图书 可以
一本图书能否对应多个作者 可以
create table book(
id int not null unique auto_increment,
title varchar(32),
price varchar(32) # 千万不要加英文逗号
);
create table author(
id int primary key auto_increment,
name char(32),
age int # 千万不要加都英文逗号
);
# 外键字段建在第三张表
create table book2author(
id int primary key auto_increment,
book_id int,
foreign key(book_id) references book(id)
on update cascade
on delete cascade, # 千万不要少英文逗号
author_id int,
foreign key(author_id) references author(id)
on update cascade
on delete cascade
);
insert into book(title,price) values('傲慢与偏见',89),('围城',56); # 1,2
insert into author(name,age) values('简奥斯丁',28),('钱钟书',44),('歪果仁',38); # 1,2,3
insert into book2author(book_id,author_id) values(1,1),(1,2),(1,3),(2,1),(2,2),(2,3); # 错误
#book表
+----+-----------------+-------+ # 级联更新 级联删除的理解
| id | title | price | # 删除book表不会对作者表产生影响,但会对第三张表有影响
+----+-----------------+-------+ # 删作者表第三张表会动(因为作者表和第三张表是关联的) book表不会动
| 1 | 傲慢与偏见 | 89 |
| 2 | 围城 | 56 |
+----+-----------------+-------+
#作者表
+----+--------------+------+
| id | name | age |
+----+--------------+------+
| 1 | 简奥斯丁 | 28 |
| 2 | 钱钟书 | 44 |
| 3 | 歪果仁 | 38 |
+----+--------------+------+
#第三张表
+----+---------+-----------+
| id | book_id | author_id |
+----+---------+-----------+
| 1 | 1 | 1 |
| 2 | 1 | 3 |
| 3 | 2 | 2 |
+----+---------+-----------+
#3. 一对一
1. 将用户表拆分成 用户表与用户详情表
2. 客户与学生
id name age phone addr hobby is_dog
1 Jason 18 110 安徽 read 1
2 tank 38 120 湛江 生蚝 1
3 egon 85 130 山东 bb 1
4 Jerry 28 140 云南 baby 0
-------------------------------------------------------
id name age ┃ phone addr hobby is_dog
1 Jason 18 ┃ 110 安徽 read 1
2 tank 38 ┃ 120 湛江 生蚝 1
3 egon 85 ┃ 130 山东 bb 1
4 Jerry 28 ┃ 140 云南 baby 0
-------------------------------------------------------
复制表
create table xxx from select * from tmp;
会创建出一张xxx表 并且表中的数据跟tmp是一模一样的
但是没有键关系,只拷贝数据和表结构
表操作
first
after
change