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

电脑硬盘上:

  • 文件空间的占用时 将此存储空间 逻辑上设置为已占用 并往里存储它 ,别的文件就不能往这块空间存了
  • 删除文件时 将此存储空间 逻辑上设置为可占用 但并没有把里面的数据清理允许文件覆盖占用地 继续存储着的
相关推荐
2501_911121237 分钟前
PostgreSQL日常维护
数据库·oracle
看到千里之外的云16 分钟前
Oracle 11g post PSU Oct18 设置ssl连接(使用jks)
数据库·oracle·ssl
人类恶.22 分钟前
C 语言学习笔记(指针1)
c语言·笔记·学习
Tiny番茄22 分钟前
对抗学习(AL),生成对抗网络(GAN),强化学习,RLHF
人工智能·学习·生成对抗网络
liang_202622 分钟前
【ULR #1】打击复读 (SAM, DAG链剖分)
笔记·学习·算法·图论
什么都想学的阿超22 分钟前
14【高级指南】Django部署最佳实践:从开发到生产的全流程解析
数据库·django·sqlite
林的快手24 分钟前
基于 Redis 实现短信验证码登录功能的完整方案
java·开发语言·数据库·redis·缓存·bootstrap
影龙帝皖26 分钟前
Mysql数据库相关命令及操作
数据库·mysql·oracle
why1511 小时前
深信服golang面经
开发语言·后端·golang
搏博1 小时前
无人机集成毫米波雷达与双目视觉的融合感知系统深度解析
python·深度学习·学习·机器学习·动态规划·无人机