一、约束条件之主键
Primary Key 主键
- 单子从约束角度来看
主键等于非空且唯一 not null unique
create table t1(id int primary key, name varchar(32));
- InnoDB存储引擎规定
一张表必须有一个主键且只有一个主键 如果创建的表中没有主键也没有非空且唯一的字段 那么InnoDB存储引擎会自动采用一个隐藏的字段作为主键 (逐渐主要适用于来加快数据查询相当于一本书的目录) - 如果创建的表中没有主键
但是有非空且唯一的字段 那么InnoDB存储引擎会自动将该字段设置为主键
补充知识
id int primary key
sid int
nid int primary key(sid,nid)
4. auto_increment 自增 该约束条件不能单独使用 必须要跟在键后面(主要配合主键一起使用)
create table t3(id int auto_increment);
create table t3(id int primary key auto_increment, name varchar(32);
我们发现auto_increment有自增的特点 但是自增的操作不会因为删除数据完之后而重置从1开始
但是如果非要重置主键 需要格式化表 Truncate 表名; # 删除表数据并重置主键值
二、约束条件之外键(一对多)
前戏(一张员工表格)
上述表述的缺陷
1.表结构不清晰 到底是员工表还是部门表(说都是都不过分)
2.字段数据反复存取 浪费存储空间(新增数据 数据一样)
3.表的扩展性极差 想修改一个数据表格全部改变复嘈杂
优化操作
1.拆表将员工分为一个表 部门分一个表
2.但是拆完不知道谁是那个部门的了
3.解决方案创建一个部门编号填写部门数据的主键值
外键字段专门用于记录表于表之间的关系
外键字段主要是用来记录表于表之之间数据的关系 而数据的关系有四种
一对多关系 多对多关系 一对一关系 没有关系
如何判多表数据之间的关系判定呢?(换位思考)
1.先站在员工表角度
一名员工数据能否对应多条数据部门
不行
2.再站部门表角度
一个部门能否拥有多个员工
可以
完成关系判定之后得出结果 一个可以一个不可以 那么关系就是一对多
针对一对多的关系 外键字段键在多的一方(没有多对一 统称为一对多)
1.先写普通字段
2.然后在写外键字段
create table user_txt(id int primary key auto_increment,
name varchar(32),
gender enum('male','female','others') default 'male',
dep_id int,
foreign key(dep_id) references dep_txt(id));
create table dep_txt(id int primary key auto_increment,
position varchar(32),
target varchar(32));
创建表的时候需要先创建被关联的表(没有外键) 然后再是关联表(有外键)否则报错
插入表数据的时候 针对外键字段只能填写被关联表字段已经出现过的数据值
被关联字段无法修改和删除 有点不太好 操作限制性太强
这个时候我们就需要用到新的功能 级联更新、级联删除(被关联的数据一旦变动 关联的数据同步变动)
在实际工作中 很多时候可能并不会使用外键 因为外键增加了表之间的耦合度 不便于单独操作 资源消耗增加 我们为了能够描述出表数据的关系 又不想使用外键 自己通过写SQL 建立代码层面的关系
三、表关系之多对多
以书籍表和作者表为例
1.一本书的作者可以对应多个作者吗?
可以
2.一个作者可以队友多本数据吗?
可以
两边都可以 那么表数据关系就是 多对多(针对多对多关系 外键字段不能建在任意一表)
1.先写普通字段
2.然后在写外键字段
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
但是发现两个数据在互相谦让 都没有创建成功 所以多对多不能在原表修改
需要使用到固定套路 需要单独开设第三张关系表 多个关系也不能全部放在一个ID表格里面了
所以数据表格也变成一行一行的
需要单独开设出第三张关系表 存储数据关系
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) references author(id)
on update cascade
on delete cascade
四、表关系之一对一
以用户表和用户详情表为例
1.一个用户可以拥有多个信息不?
2.一个信息可以指定多个用户不
两边答案都不可以 那么先考虑是不是没有关系 如果有关系那么肯定是一对一
针对一对一的表关系 外键字段建在任何一张表都可以
(但是建议建在查询频率较高的表中便于后续查询)
create table user(id int primary key auto_increment,
name varchar(32)
detail_id int unique,
foreign key(detail_id) references userDetail(id)
on update cascade
on delete cascade
create table userDetail(id int primary key auto_increment,
phone bigint);
'''与多对一不一样的就是多一个 unique唯一约束条件 使用过就不能再次使用'''
技术小白记录学习过程,有错误或不解的地方请指出,如果这篇文章对你有所帮助请点点赞收藏+关注 谢谢支持 !!!
|