表关系
约束条件
1.primary kye主键
1.1从约束的角度上来说主键等价于非空且唯一 not null uninque
create teble t1(id int primary key,
name varchar(32));
1.2IoonDB储存引擎规定一张表必须有一个主键(主键可以加快数据查询:目录)
如果创建的表中没有主键也没有非空且唯一的字段,则IoonDB储存引擎会自动采用一个隐藏字段作为主键(这个主键是隐藏的,使用不了)
如果创建的表中没有主键但有非空且唯一的字段,则IoonDB储存引擎会自动将该字段设置为主键
create teble t2(id int not null uninque,name varchar(32));
1.3创建表的时候都应该有一个'id'字段,并且该字段应该作为主键(uid、sid、pid等等都可以)
补充
id int primary key 单列主键
sid int,
nid int,
primary kye(sid, nid) 联合主键
2.auto_increment自增
2.1该约束条件不能单独使用,必须跟在键后面(主要配合主键一起使用)
create table t1(id int auto_increment);
# 会报错
there can be only one auto column and it must be defined as a key
create table t2(id int primary key auto_increment,name varchar(32));
2.2补充
自增的操作不会因为执行删除数据的操作而退回或重置
如果非要重置主键,需要格式化表
truncate 表名;
约束条件之外键
1.推导
1.1需要创建一张员工表
id name gender dep_name dep_desc
1.2上述缺陷
表结构不清晰,到底是员工表还是部门表(小问题)
字段数据反复储存,浪费存储空间(小问题)
表的扩展性差,修改一处很多地方都要修改(大问题 效率极低)
优化>>>拆表
id name gender
id dep_name dep_desc
1.3拆表之后解决了上述三个问题,但是出现了另一个问题员工表和部门表直接没有了联系
解决措施
id name gender dep_id
添加一个部门编号字段填写部门数据的主键值>>>外键字段
2.外键字段的创建
2.1外键字段是用来记录表与表之间数据的关系,而数据的关系有四种:
一对多关系
多对多关系
一对一关系
没有关系
2.2表数据关系的判断>>>换位思考
对员工表和部门表判断数据关系
先在员工表的角度,思考一条员工数据能否对应多条部门数据
再以部门表的角度思考,一条部门数据能否对应多条员工数据
一个员工不可以属于多个部门,一个部门可以拥有多个员工
结论:那么表关系就是'一对多'
'如果放来也是叫:一对多'
表关系
表关系之一对多
1.foreign key
create table emp(id int primary key auto_increment,name varchar(32),
gender enum('male','female') default 'male',
dep_id int,foreign key(dep_id) regerences dep(id));
create table dep(id int primary key auto_increment,
dep_name varchar(32),dep_desc varchar(32));
'''
1.创建表的时候需要先创建被关联的表(没有外键),然后再是关联表(有外键)
2.插入表数据的时,外键字段只能填写被关联字段以有的数据值
3.被关联字段无法修改或删除
'''
2.级联更新、级联删除
create table emp(id int primary key auto_increment,
name varchar(32),
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 varchar(32),dep_desc varchar(32));
'''
在实际的工作中,很多时候都不需要使用外键
因为大部分时候表的数量会很多,而外键又增加了表之间的耦合度,单独操作不方便,资源消耗增加
'''
表关系之多对多
'以书籍表和作者表为例'
1.换位思考
一条书籍书籍可以对应多条作者信息,一条作者信息也可以对应多条书籍信息
结论:两边都可以,那么表数据关系就是'多对多'
create table book(id int primary key auto_increment,
title varchar(32),author_id int,
foreign key(author_id) references author(id)
on update cascade on delete cascade);
create table author(id int primary key auto_increment,
name varchar(32),book_id int,
foreign key(book_id) references book(id)
on update cascade on delete cascade);
2.上述方法无法创建表,因为创建表的时候需要先创建被关联的表
所以需要单独开设第三张关系表,储存数据关系
create table book(id int primary key auto_increment,
title varchar(32));
create table author(id int primary key auto_increment,
name varchar(32));
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) refe
/rences author(id)
on update cascade on delete cascade);
表关系之一对一
'以用户表和用户个人信息'
1.换位思考
用户表的一条数据只调用用户个人信息的一条数据
结论:两边都不可以且不是没有关系,那么就是一对一
2.一对一的表关系,外键字段建在任何一张表都可以,但最好建在查询频率高的哪一张表,这样后续查询会比较方便
create table user(id int primary key auto_increment,
anme varchar(32)datail_id int unique,
foreign key(detail_id) references userDetail(id)
on update cascade on delete cascade);
ceate table userDetail(id int primary key auto_increment,phone bigint);
标签:关系,int,auto,primary,dep,key,id
From: https://www.cnblogs.com/riuqi/p/16593310.html