【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电脑空间占用

电脑硬盘上:

  • 文件空间的占用时 将此存储空间 逻辑上设置为已占用 并往里存储它 ,别的文件就不能往这块空间存了
  • 删除文件时 将此存储空间 逻辑上设置为可占用 但并没有把里面的数据清理允许文件覆盖占用地 继续存储着的
相关推荐
海盗12348 分钟前
MySQL主从复制的配置方式
android·mysql·adb
前进的李工1 小时前
SQL聚合函数与分组查询详解
数据库·sql·mysql
上进小菜猪2 小时前
基于 YOLOv8 的驾驶员疲劳状态识别系统实战(含完整源码与可视化界面)
后端
上进小菜猪2 小时前
基于 YOLOv8 的交通标识与设施识别系统(含完整源码)
后端
石像鬼₧魂石2 小时前
HexStrike-AI人工智能 渗透测试学习(Metasploitable2 192.168.1.4)完整流程总结
学习·ubuntu
Evan10242 小时前
MySQL 8.4.7版本下载&安装详细教程(Win11环境)
mysql
非凡ghost2 小时前
MusicPlayer2(本地音乐播放器)
前端·windows·学习·软件需求
程序员-周李斌3 小时前
Java 死锁
java·开发语言·后端
蓝桉~MLGT3 小时前
Ai-Agent学习历程—— 阶段1——环境的选择、Pydantic基座、Jupyter Notebook的使用
人工智能·学习·jupyter
布列瑟农的星空3 小时前
还在手动翻译国际化词条?AST解析+AI翻译实现一键替换
前端·后端·ai编程