
MySQL(三)数据库约束
[一、not null](#一、not null)
[四、primary key](#四、primary key)
[五、foreign key](#五、foreign key)
数据库约束
列字段对行记录的数据的约束
一、not null
sql
create table student(id int not null);
not null 约束此列字段的行数据 不能为空
二、default
sql
create table student(name varchar(20) default 'unknow');
约束此列字段的行数据 在默认时的值是什么
每个列字段 默认都会有的default值 是null
三、unique
sql
create table student(id int unique);
约束此列字段的行数据 之间不能重复 是唯一的
唯一性字段unique 、primary key 的 ++每次新入行数据++ 时 都会去遍历查询 是否会重复:
--->++唯一性列字段++ 创建时 会自动生成有索引,每次在此列字段 新入行数据时 都会用索引 精确定位到此列地 遍历检查行数据 是否会重复
四、primary key
sql
create table student(id int primary key auto_increment);
约束 此列字段的行数据 或多个列字段的合行数据(联合主键) 非空且唯一,相当于是not null与unique两约束的合体版
作为记录的身份标识字段 ,一张表中 只能有一个主键 ,每次新入主键的行数据时 会触发 唯一性字段的 索引遍历查询重复
1.自增主键机制
每个记录的主键值 都由数据库服务器 自动机动分配设置
1.1单服务器下
单个mysql服务器里,主键可设置 自增主键机制auto_increment,服务器会维护着 当前主键值的最大值 ,每次分配时 以当前的最大值+1 来自增唯一id分配
1.2**分布式下**
分布式下的 多个mysql服务器中,如果++用每个mysql服务器 各自维护的 当前最大值 来分配的话,主键值会重复 不行的++ ,分布式用 唯一id = 时间戳 + 主机编号 + 随机因子 来自增唯一id分配:
1.2.1时间戳
分布式下 用记录产生时的时间戳 作为id ,如果单位时间内 产生的记录很多,可以++把时间戳 往小设置 设置成毫秒级 微秒级的++ ,尽量使得单位时间戳内 只有一条记录的产生 而去分配
1.2.2主机编号
如果发现单位时间戳内 同时产生有多条记录时 ,就将时间戳id 再拼上 记录产生所处的 mysql服务器的主机编号,一般情况下,当设置的时间戳单位 小到一台机器 一时间戳内 无法连续完成产生记录时,此时的多条记录 肯定是由不同主机同一时刻产生的,加上各自的主机编号后 就能确保id是唯一的了
1.2.3随机因子
如果设置的时间戳不够小,发现同一时间戳内产生的记录 是由同一台服务器主机产生时的 ,此时再在 同台机器同时间戳的记录 的id后面 再拼上****随机因子数 使得id不同
五、foreign key
sql
create table class(classId int primary key,name varchar(20));
create table student(id int primary key,classId int,name varchar(20),foreign key(classId) references class(classId));
约束此列字段的行数据 来源包含于 外表的唯一性列字段行数据
1.∈关系维护
外键维护着 子表数据∈父表数据 的关系:
1.1父约子:
子表新入 此外键列字段行数据时,必须来源于 父表此列字段的行数据
1.2子约父:
父表更改 外键关联的 此列字段行数据时,必须确保 子表此列字段里没有包含它
1.3删表:
删除表时,只能 先删子表再删父表
2.逻辑删除
2.1子表存父表删
很多时候,父表需要删除 但子表不能删除 ,就可以通过在逻辑上 把父表状态设置为删除 来实现 父表删,子表存 的效果 ,而++实际上父表还在硬盘中 未删除++ ,++等到后面子表 可以需要删除时,再真正地将 子表与父表都删去++,实现灵活删除的效果
2.2电脑空间占用
电脑硬盘上:
- 文件空间的占用时 将此存储空间 逻辑上设置为已占用 并往里存储它 ,别的文件就不能往这块空间存了
- 删除文件时 将此存储空间 逻辑上设置为可占用 但并没有把里面的数据清理 ,允许文件覆盖占用地 继续存储着的