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

电脑硬盘上:

  • 文件空间的占用时 将此存储空间 逻辑上设置为已占用 并往里存储它 ,别的文件就不能往这块空间存了
  • 删除文件时 将此存储空间 逻辑上设置为可占用 但并没有把里面的数据清理允许文件覆盖占用地 继续存储着的
相关推荐
snpgroupcn3 分钟前
泰国零售巨头 CJ Express 借助 SAP 内存数据库实现高效数据管理
数据库·express·零售
方圆想当图灵9 分钟前
深入理解软件设计:领域驱动设计 DDD
后端·架构
excel20 分钟前
MySQL 9 在 Windows 上使用 mysqld --initialize-insecure 无响应的排查与解决方案
后端
weixin_4640780723 分钟前
Python学习小结
python·学习
你怎么知道我是队长24 分钟前
GO语言---defer关键字
开发语言·后端·golang
方圆想当图灵37 分钟前
深入理解软件设计:什么是好的架构?
后端·架构·代码规范
FJSAY1 小时前
我自己动手写了一个MySQL自动化备份脚本,基于docker
mysql·docker·自动化
love530love2 小时前
是否需要预先安装 CUDA Toolkit?——按使用场景分级推荐及进阶说明
linux·运维·前端·人工智能·windows·后端·nlp
明月看潮生2 小时前
青少年编程与数学 01-011 系统软件简介 19 SSMS 数据库管理工具
数据库·青少年编程·编程与数学
一勺菠萝丶2 小时前
宝塔安装MySQL无法远程连接【已解决】
mysql