一对多关系
# 如何判断表关系
'''一对多的判断?'''
以图书表和出版社表为例
1. 站在两张表的角度,分别问一个问题,一本图书能不能有多个出版社?不能
2. 一个出版社能不能有多个图书?能
'''
结论:如果一个能,一个不能,那么表关系就是'一对多'
针对一对多的关系,外键字段健在多的一方
'''
1 一对多表关系,外键字段建在多的一方
2 在创建表的时候 一定要先建被关联表
3 在录入数据的时候 也必须先录入被关联表
# 被关联表
create table dep(
id int primary key auto_increment,
dep_name char(16),
dep_desc char(32)
)
create table emp(
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
create table dep(
id int primary key auto_increment,
dep_name char(16),
dep_desc char(32)
);
create table emp(
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('教学部','教书育人'),('技术部','技术能力有限');
多对多关系
以图书和作者表为例
1. 站在图书表角度
问:一个图书能否有多个作者写?
答:可以
2. 站在作者表的角度
问:一个作者能否写多本书
答:可以
'''
结论:如果两边都可以,那么,表关系就是多对多
针对,多对多关系,外键字段不健在任何一方
而是,健在第三张表中
'''
书名表和作者表,再额外创建一个id表关联它们
create table book(
id int primary key auto_increment,
title varchar(32),
price int
);
create table author(
id int primary key auto_increment,
name varchar(32),
age int
);
create table book2author(
id int primary key auto_increment,
author_id int,
book_id int,
foreign key(author_id) references author(id)
on update cascade
on delete cascade,
foreign key(book_id) references book(id)
on update cascade
on delete cascade
);
insert into book(title,price) values('jpm',6699),('lzzy',9966),('tpt',5555);
insert into author(name,age) values('jason',99),('egon',88);
一对一
'''一对一关系判断'''
以作者表和作者详情表为例
1. 站在作者表角度
问:一个作者能否有多个作者详细?
答:不可以
2. 站在作者详情表的角度
问:一个作者详情能否有多个作者
答:不可以
'''
结论:两边都不能,那就是一对一,或这没有关系
针对,一对一关系,外键字段健在任何一方都可以,推荐在使用频率比较高的一张表
'''
信息表和详情表,每个人只能对应一个详情
create table people(
id int primary key auto_increment,
name varchar(16),
age int,
message_id int unique,
foreign key(message_id) references message(id)
on update cascade
on delete cascade
);
create table message(
id int primary key auto_increment,
QQ int,
weixin int,
addr varchar(50)
);
insert into message(QQ,weixin,addr) values(127,127,'shanghai'),(135,135,'wuhan');
insert into people(name,age,message_id) values('ly',18,1),('lw',22,2);
约束条件
zerofill 用0填充空的位置
unsigned 去掉负数,也就是相当于给正整数长度127*2
default 默认值
unique 唯一
not null 非空
primary key 主键
auto_increment 自增 通常配合主键使用