约束条件
主键
- 一. 主键设置
- 主键设置关键字 primary key
create table t1( id int primary key, name varchar(32) ); -
- 从约束角度看主键等价于非空且唯一
# not null unique -
- InnoDB引擎规定一张表只能有一个主键
1. 如果创建的表没有设置主键,非空且唯一的字段会被默认设为主键. 非空且唯一的字段也没有, InnoDB会将隐藏的字段最为主键 id int not null unique 2. 主键可以加快数据查询 3. 创建表的时候都需要有id字段,并且id字段应设为主键 (uid,id,pid等id,名字代表id就可) 4. 单列主键 id int primary key 5. 联合主键 id1 int,id1 int,primary key(id1,id2)
- 主键设置关键字 primary key
- 二. 主键自增
-
- 自增设置关键字 auto_increment
-
- 主键的自增作为约束条件要跟在键的后面,无法单独使用
# 使用方式 create table t( id int primary key auto_increment, name varchar(32) ); -
- 自增的特点
在删除数据时,自增操作不会回退与重置,想要重置主键,需要对表格式化 truncate 表名; # 删除表数据并重置主键值
-
外键
-
- 外键字段专门用于记录表与表之间的数据关系
# 数据的关系有四种 1. 一对一的关系 2. 一对多的关系 3. 多对多的关系 4. 没有关系 对于表关系如何判定呢: 换位思考他们的关系几对几 -
- 关于外键的创建位置
1. 针对'一对多'的关系,外键字段建在多的一方 2. 针对'多对多'的关系,外键需要开设第三张关系表存储数据关系 3. 针对'一对一'的关系,外键可以建在任何一方,但是一般选择建在查询频率较高的表
表关系
- 外键设置关键字 foreign key
- 必须基于多张表的创建才能设置表关系
一对多
- 创建一对多的表关系数据
1.先写普通字段 2.然后再写外键字段 create table dep( id int primary key auto_increment, dep_name varchar(32), dep_desc varchar(32) ); create table emp( 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(id) );- 实操
-
- 创建表的时候需要先创建没有外键的表,然后是有外键的表
- 创建表的时候需要先创建没有外键的表,然后是有外键的表
-
- 插入表数据的时候,外键字段只能写关联表字段里的数据值
- 插入表数据的时候,外键字段只能写关联表字段里的数据值
-
- 被关联字段的操作限制性太强,无法进行修改与删除
- 被关联字段的操作限制性太强,无法进行修改与删除
-
- 实操
- 怎么解决这些问题呢?
- 级联更新,级联删除
on update cascade # 级联更新 on delete cascade # 级联删除- 被关联数据一旦变动,关联的数据同步变动
create table emp1( id int primary key auto_increment, name varchar(32), gender enum('male','female','others') default 'male', dep_id int, foreign key(dep_id) references dep1(id) on update cascade on delete cascade ); create table dep1( id int primary key auto_increment, dep_name varchar(32), dep_desc varchar(32) );
- 被关联数据一旦变动,关联的数据同步变动
- 级联更新,级联删除
- 扩展
在实际工作中,很多时候可能并不会使用外键 因为外键增加了表之间的耦合度 不便于单独操作 资源消耗增加 我们为了能够描述出表数据的关系,又不想使用外键 自己通过写SQL,建立代码层面的关系
多对多
- 创建多对多的表关系数据
- 不能直接创建,需要单独开设第三张关系表。存储数据关系
- 正确步骤
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 bookauthor( 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 # 级联删除 ); - 实际操作
- 不能直接创建,需要单独开设第三张关系表。存储数据关系
一对一
- 创建一对一的表关系数据
- 正确步骤
create table userDetail( id int primary key auto_increment, phone bigint ); 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 );- 实际操作