【MySQL】数据库约束

MySQL(三)数据库约束

数据库约束

[一、not null](#一、not null)

二、default

三、unique

[四、primary key](#四、primary key)

1.自增主键机制

1.1单服务器下

1.2分布式下

1.2.1时间戳

1.2.2主机编号

1.2.3随机因子

[五、foreign key](#五、foreign key)

1.∈关系维护

1.1父约子:

1.2子约父:

1.3删表:

2.逻辑删除

2.1子表存父表删

2.2电脑空间占用


数据库约束

列字段对行记录的数据的约束

一、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);

约束此列字段的行数据 之间不能重复 是唯一的

唯一性字段uniqueprimary 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电脑空间占用

电脑硬盘上:

  • 文件空间的占用时 将此存储空间 逻辑上设置为已占用 并往里存储它 ,别的文件就不能往这块空间存了
  • 删除文件时 将此存储空间 逻辑上设置为可占用 但并没有把里面的数据清理允许文件覆盖占用地 继续存储着的
相关推荐
爱和冰阔落28 分钟前
【MySQL 慢查询排查实战】列表接口逐渐变慢时,怎样从请求链路定位原因
android·数据库·mysql
JacksonMx34 分钟前
企业级 JPA 与数据库架构落地指南
数据库·数据库架构
Dxy123931021635 分钟前
MySQL有哪些锁?InnoDB锁体系完整梳理博客
数据库·mysql
明月_清风37 分钟前
vLLM 深度实战:2026 年生产级 LLM 推理引擎完全指南
前端·后端·ai编程
老当益壮梁奶奶43 分钟前
Linux软件编程学习笔记(二)Linux文件IO编程入门:从fopen到fgetc
linux·c语言·c++·笔记·学习
sunoo-22943 分钟前
C 语言文件 IO 全攻略:从基础函数到实战踩坑(BMP 读取 + 词典查询)
linux·c语言·前端·笔记·vscode·学习
吃饱了得干活1 小时前
限界上下文之后:微服务怎么拆、上下文怎么聊?
java·后端·架构
星火10241 小时前
【Groovy翻译-进阶篇】运行时元编程与编译时元编程(上)
后端·groovy
wear工程师1 小时前
MySQL 索引条件下推是什么?Using index condition 并不是覆盖索引
sql·mysql
CHHH_HHH1 小时前
【Linux系统篇】深入解析Linux文件系统:从磁盘寻址到软硬链接
linux·服务器·开发语言·后端·ubuntu