文章目录
约束
概述
就是一种限制,用于修饰表中的列。
通过这种限制来保证表中数据的正确性 ,有效性 和完整性
分类
主键约束
概述
设定表中某一字段为主键,那么该字段所在列的数据就能够唯一的标识表中的每一行数据
特点
唯一,非空,非业务相关
定义及删除
- 在建表时进行指定
create table 表名 (id int primary key,其他字段,...);
- 在已有表中进行指定(原来表没有主键)
alter table 表名 add primary key(字段);
- 删除主键
alter table 表名 drop primary key;
主键自增
使用原因 :设置主键,如果让我们自己添加主键很有可能有重复的主键而导致数据添加失败,所以我们通常希望在每次插入新纪录时,数据库自动生成主键字段的值
语法 :
字段名 字段类型 primary key auto_increment;
注意 :需要让主键自动增加,主键需要是整数类型
举例 :
delete和truncate删表对id的影响
- delete删除表中的数据,不重置auto_increment的值
就是说用delete删除了id为3的数据,当下次增加一个数据时,id为4
- truncate摧毁表,重建表,重置auto_increment的值
使用truncate删除表,当增加数据时,id从1开始自增
设置主键从指定值自增
如果相自定义id的值,可以设定自动增加起始值语法
alter table 表名 auto_increment = 起始值;
唯一约束
作用
被唯一约束的字段,本列数据不允许出现重复数据,null除外,null可以出现多个
语法
- 创建表时指定
create table 表名 (字段名 字段类型 unique,其他字段名,...);
- 已有表给指定字段添加唯一约束
alter table 表名 add unique(字段);
非空约束
作用
被非空约束的字段,本列数据不允许出现null(即空)数据。
语法
- 创建表时指定
create table 表名(字段名 字段类型 not null,其他字段名,...);
- 已有表给指定字段添加非空约束
alter table 表名 modify 字段 类型 not null
面试题:非空+唯一约束与主键约束有什么区别
- 主键约束在表中只能存在一个,但是非空+唯一约束可以存在多个
- 主键可以添加自增约束,但是非空+唯一不能
- 主键约束底层维护了一个主键索引,而唯一约束底层维护的是唯一索引(这个知识点后面会描述)
默认值约束
作用
被默认值约束的字段,相当于给字段添加默认值,插入数据值如果字段没有被赋值,则使用默认值
注 :null相当于空值,也是被赋于值,所以写null时不会使用默认值
语法
- 创建表时指定
create table 表名(字段名 字段类型 default 默认值,其他字段,...);
- 已有表给指定字段添加默认值约束
alter table 表名 modify 字段 类型 default 默认值;
总结
约束 | 特点 | 关键字 |
---|---|---|
主键约束 | 非空,唯一 | primary key |
唯一约束 | 唯一 | unique |
非空约束 | 列值不能为null | not null |
默认值约束 | 添加默认值 | default 值 |
表关系及外键约束
表关系
概述
数据库中的表描述的事物,我们一般被称为实体,实体于实体是存在关系,那么表于表之间也就存在关系
分类
- 一对一 (老公和老婆)
- 一对多 (部门和员工)
- 多对多 (学生和课程)
一对多关系表设计
一个用户可以有多个订单,一个定义只能属于一个用户
用户:订单<=>1:n
外键字段
"一方"叫主表 ,"多方"叫从表
设计时通常会在从表 添加一个字段,用于存放主表主键的值 ,这个字段叫外键字段
外键存在一种约束,只能是主表中主键存在的值,这样就保证主从表数据之间对应的一致性和完整性
设计原则
在多方创建一个字段作为外键,从表外键值指向一方中的主键
也就是在订单表中设置一个字段user_id(外键字段),里面存放用户表的id主键值
多对多关系表设定
设计原则
需要创建第三张表作为中间表,中间表至少俩个字段(外键字段),分别指向各自一方的主键
一对一关系表设定
设计原则
- 两张表合并为一张表
- 如果必须要创建外键,任选其中一方作为从表如何设置外键字段
外键约束
概述
就是从表中设定一个字段,用来保存主表中的主键值。
外键约束力从表的外键值只能是主表的主键值
语法
- 创建表示时创建外键
create table 表名(
其他字段,
外键字段名 int,
constraint 外键名 foreign key (当前表外键字段名) references 主表名(主键字段)
);
- 修改字段为外键
alter table 表名 add constraint 外键名 foreign key (当前表外键字段名) reference 主表名(主键字段);
- 删除
alter table 从表名 drop foreign key 外键名;
注意事项
- 添加数据时
先添加主表的数据,再添加从表的数据
- 删除数据时
先删从表中的数据,再删主表中的数据
- 修改数据时
如果主表中的主键被从表引用了,不能修改此主键的值
外键的级联
概述
就是在修改或者删除主键是可以同时对从表的外键进行修改或删除
语法
on update cascade 修改
on delete cascade 删除
多表查询
笛卡尔积
概述
多张表查询时每张表的每条数据组合成的数据结果集,叫做笛卡尔积(交叉组合)
当我们发现不是所有的数据都是有用,所以就要消除笛卡尔积
消除方式
条件 : 从表.外键 = 主表.主键
内连接查询
隐式内连接
select 列名 from 左表,右表 where 从表.外键 = 主表.主键;
显示内连接
select 列名 from 左表 [inner] join 右表 on 从表.外键 = 主表.主键;
区别
结果一样,隐式内连接先进行笛卡尔积在筛选数据;而显示内连接在查询时就对数据进行过滤
显示内连接更能代表内连接
外连接查询
左外连接
左表中所有的记录都出现在结果中,如果右表没有匹配的记录,使用null填充
select 列名 from 左表 left join 右表 on 从表.外键 = 主表.主键;
右外连接
右表中所有的记录都出现在结果中,如果左表没有匹配的记录,使用null填充
select 列名 from 左表 right join 右表 on 从表.外键 = 主表.主键;
子查询
单行单列
父查询使用比较运算符: > < =
多行单列
子查询可以认为是一个数组,父查询用in,all,any关键字
多行多列
子查询可以认为它是一个虚拟表,可以使用表连接再次进行多表查询
注意:如果要访问子查询表的字段,需要为子查询表取别名,否则无法访问表中的字段