MySQL 数据库约束

article/2025/9/28 3:15:38

目录

一、数据库约束 

1、约束类型

二、NULL 约束

三、unique 约束

四、default 约束

五、primary key 约束

自增主键

六、foreign key 外键约束

七、check 约束


一、数据库约束 

我们使用数据库来存储数据,一般是希望这里存储的数据是靠谱的,那么如何来保证数据是否靠谱呢?

那么MySQL就提供了一些机制,辅助我们自动的依赖程序,对数据进行检查,这类检查数据的机制,就是“约束”,一旦把约束确定好了,MySQL就会自动的对修改的数据做出检查,看看你此处的这个数据是否靠谱,如果不靠谱,不满足约束,就会直接报错。

1、约束类型


二、NULL 约束

YES 表示这两列允许为空,因此可以向表中插入null

那么现在我们重新创建一个 student 表,并加入 not nul 约束,再来看看结果

注意:not null 是对 列名 进行的一个约束,是给列名来指定的,写到列后面

 此时我们会发现,id 可以为 null ,但是 name 不能为 null,那么现在,我们尝试插入一个name 为 null 的数据又会发生什么呢?

 此时,会给我们一个明显的提示: name 这一列不能为 null

当 name 不为null 的时候,便可以正常插入数据了


三、unique 约束

不允许存在两行数据,再这个指定列上重复

此处的限制不能重复,指的是,指定列,不同行之间

同一行 不同列之间 或者  不同行 不同列之间 可以重复

和 not null 类似,unique 也是放在后面

我们现在,重新创建一个student表

那么此时,是可以插入重复的数据的

现在,我们再重新创建一个表

 此时会发现在表的结构中,出现了一个UNI 的标志,它是unique 的前三个首字母,代表了唯一

当我们往表中插入两个编号一样的学生的时候,就会发生报错

 针对带有unique 约束的数据,在插入记录的时候,就会先进行查询,看看结果是否以及存在,存在才插入,不存在则不会进行插入。同理,修改也是一样的


四、default 约束

规定没有给列赋值时的默认值

我们先重新创建一个student 表

然后对其进行指定列插入

 

使用指定列插入的时候,未被指定的列就会按照默认值来进行填充,其中如果我们不修改默认值,那么默认情况下的默认值就是NULL

 那么如何修改这个默认值呢?

只需要在创建表的时候在后面加上default 默认值便可

 所以,此时,我们能看到defult 那一栏中name 所对应的默认值 便是 ‘未命名’

插入数据的时候,大多数情况下,都还是需要手动指定插入值的,使用默认值,会让代码看起来没有那么的直观。

比如这个代码,和‘未命名’三个字没有任何的关联,但是数据库的内容 的确包含 ‘未命名’ 


五、primary key 约束

主键约束,主键就是一条数据的身份标识

通过这个约束,来指定某个列作为主键

1、非空

2、不能重复

一个表,只能有一个主键 

 同样的,我们重新创建一个 student 表,此时,让id 成为主键

 此时,我们再烂看看这个表的属性就能发现,id 在NULL 这一栏是不能为空的,Key这一栏中的PRI 是primary 的缩写,这个时候,id 便被我们标记成了主键

此时,我们再插入两条一样的数据,或者插入了 id 为 NULL 的数据就会发生报错。 

那么现在,我们来尝试创建一个有两个主键的表:

 此时,它就会提示我们当前的主键已经被多次定义

因此,主键只能有一个,但是一个主键可以对应一个列或者多个列

主键,往往是一个 整数 类型的 Id,要求不能重复

自增主键

允许客户端,再插入数据的时候,不手动指定主键的值,而是交给MySQL自行分配,确保分配出来的这个主键的值,是和之前不重复的

那么现在我们来看一下这个自增主键是怎么样进行使用的

 其中 auto_increment 的意思就是 自动增加

此时,这个主键就变成了自增主键,并且auto_increment 必须搭配整数类型的主键使用 

 注意:这样的插入操作是OK的

这是因为,此时的 id 列是自增主键,设置成NULL 是让数据库自行分配一个 id

 

这时,我们能看到刚才的 id 是1 

当我们再插入两条数据之后, id 依旧会按照自增的方式自行分配

自增主键 也是可以手动指定值的

 

那么如果下次再插入数据  按照NULL 让数据库自己分配的方式 此时新的记录是 4 还是 11 呢?

 

 很明显,答案是11

那么这个 id 咋分配的呢?

MySQL 会记录当前 id 中的最大值,下一个分配的 id 就会在之前的最大值的基础上,继续自增

 MySQL 是会维护这样的最大值的

如果MySQL 是一个单个节点的系统,基于上述策略,没有啥问题

如果MySQL 是一个分布式系统,此时,自增主键就无法保证唯一性 

(每个主机上的MySQL只知道自己这个主机上存储的最大值,不知道其它节点的情况)

对于分布式系统下,要想分配这种表示唯一性的id,就不能依赖MySQL 的自增主键了

 为了解决上述问题,也有很多分布式 id 的生成算法

核心公式:

目标是为了保证系统中每个节点 生成的id 都是唯一的

把 id 作为一个字符串,这个字符串由下列几个部分拼接而成:


六、foreign key 外键约束

 涉及到两个表之间的约束

我们将约束别人的表称为: 父表

将被别人约束的表称为: 子表

我们先创建一个class 表,并向其中插入几条数据:

     再创建一个student 表来完成一个外键约束

 

在这个代码中,需要明确交代,谁(哪个表的哪一列) 要受到 谁 (哪个表的哪一列)的约束 

 创建外键约束的时候,是修改子表的代码,父表的代码是不受影响的

1、进行插入或者修改子表中受约束的这一列数据,就需要确保 插入/修改 后的结果 在父表中存在

(针对这种带有外键约束的 插入/修改 就会触发查找操作,在父表中进行查询)

2、删除/修改 父表中的记录,就要看看这个记录是否在子表中被使用了,如果被使用了,则不能进行删除或者修改                                                             

3、删除父表之前必须要先删除子表

4、primary key 和 unique 这两个约束自带索引,没有索引就不能建立外键

 现在我们来考虑一下下面这个场景:

 

 那么在上述场景中,如何实现商品下架这个功能呢?

针对这样的场景,我们一般使用逻辑删除

如果要实现商品下架,直接 update 把商品表中的 ok 改成 0.

实现获取商品列表,就在select 的时候加个条件 and ok = 1   


七、check 约束

写一个具体的条件表达式,当前的记录符合条件就可以进行 插入/修改  ,不符合条件就失败

对于MySQL5 来说,check 并不支持,写上不会报错,但是并没用什么用


http://chatgpt.dhexx.cn/article/bPtfNKK5.shtml

相关文章

数据库的约束和设计(完整版)

第一部分(约束和表设计) 1、DQL查询语句-limit语句(掌握) LIMIT是限制的意思,所以LIMIT的作用就是限制查询记录的条数 LIMIT语句格式: SELECT 字段 FROM 表名 LIMIT 索引, 显示条数; 索引:从0开始,一直变化 显示条数:每页显示…

MySQL数据库之数据库约束,一文带你了解

前言 从今天开始本系列就带各位小伙伴学习数据库技术。数据库技术是Java开发中必不可少的一部分知识内容。也是非常重要的技术。本系列教程由浅入深, 全面讲解数据库体系。 非常适合零基础的小伙伴来学习。 全文大约 【1785】字,不说废话,只讲可以让你学…

数据库的约束和设计

约束 作用 对表中的数据进行进一步的限制, 保证数据的正确性, 有效性和完整性 种类 primary key : 主键约束unique : 唯一约束not null : 非空约束default : 默认值foreign key : 外键约束auto_increment : 自增约束(适用于int数据类型) 主键约束 特点 非空且唯一 注意事项 …

MySQL:数据库的约束

目录 1.数据库约束 1.1 非空:not null 1.2 唯一:unique ​​​​​​​ 1.3 默认值:default 1.4 列描述:comment 1.5 主键约束:primary key 1.6 外键约束 1.7 综合案例 2.插入查询结果 3.聚合函数 4.group by…

oracle数据库:约束

约束简介 约束是数据库用来确保数据满足业务规则的手段,不过在真正的企业开发中,除了主键约束这类具有强需求的约束,像外键约束,检查约束更多时候仅仅出现在数据库设计阶段,真实环境却很少应用,更多是放到…

[数据库]表的约束

●🧑个人主页:你帅你先说. ●📃欢迎点赞👍关注💡收藏💖 ●📖既选择了远方,便只顾风雨兼程。 ●🤟欢迎大家有问题随时私信我! ●🧐版权:本文由[你帅…

MySQL数据库,数据的约束

目录 1.数据的约束 1.1约束的类型 1.2NULL约束 1.3UNIQUE约束 1.4DEFAULT约束 1.5PRIMARY KEY约束 1.6FOREIGN KEY约束 1.数据的约束 首先,创建一个名为test的数据库: mysql> create database test charset utf8; Query OK, 1 row affected …

MySQL数据库(数据库约束)

目录 数据库约束 数据库约束的类型: null约束 : unique约束(唯一约束): default约束(默认值约束): primary key约束(主键约束): for…

数据库中的8种常见约束定义

数据库中常见约束的定义理解和应用(附代码) 首先来说数据库中约束的定义是什么? 约束定义:按照表中的数据规则,如果存在违反约束的数据行为,行为就会被阻止。 一般在创建表之后就会创建相关列的约束&#…

基础SQL第二课:约束

一、约束: 什么是约束? 为了确保表中的数据的完整性(准确性、正确性),为表添加一些限制。是数据库中表设计的一个最基本规则。使用约束可以使数据更加准确,从而减少冗余数据(脏数据)。 数据库完整性约束分…

sublime解决中文乱码问题

首先找到你选择的build-system,如下图所示: 第二步:找到preferences下的browse packages,点击进入目录 第三步:找到对应的.sublime-build文件 第四步:打开文件,将"env": {"LANG&…

sublime text 3211 安装中文包

sublime text 3211 安装中文包 安装步骤: 1、打开Sublime Text3,选择Preferences ->Package Contorol 2、在Sublime Text3 弹窗输入install package,选择对应命令,然后鼠标点击安装install package 3、等待一会Sublime Text3 的 insta…

Sublime 中文命名乱码(显示为方框)

今天在使用Sublime中发现,将文件名以部分文字以中文命名,非中文部分能正常显示,中文部分显示不出来。如下图所示 这里就是python能显示出来,其他的汉字就变成了方框。与此对应的现象还有部分文本的部分内容显示为繁体 &#xff0…

解决sublime汉化后部分中文显示为繁体字

解决sublime汉化后部分中文显示为繁体字 1. 问题描述2. 解决方法3. 修正之后的效果 1. 问题描述 使用插件下载汉化包之后,部门字体仍显示为繁体,如下图 这种字体看着实在是别扭的不行 2. 解决方法 找到首选项 -> 设置 添加以下内容 "font_o…

关于sublime中文上下跳动错位的解决方法

关于sublime中文上下跳动错位的解决方法 在preferences-settings打开 增加"font_options":[“gdi”] 对比效果如下:

Sublime text文本编辑器中文乱码解决方法

Sublime text 出现中文乱码的解决方法 问题描述 Sublime text文本编辑器用起来感觉挺好的,它的代码补全功能非常不错,界面也很漂亮。 最近在学习C语言,我感觉Dev-C的界面比较朴实,代码补全功能操作性太强。因此,我会…

Sublime Text3 中文错位解决办法

在使用prettytable库打印列表时偶然发现,相同的中英文混合字符串表格在Windoows控制台以及NotePad上能对齐显示,在SublimeText3以及EmEditor上无法对齐显示: Windoows控制台(能对齐显示): EmEditor&…

sublime离线插件安装

一、首先需要安装Package Control 参考官网:Installation - Package Control中的方法。 其中分联网自动下载安装和手动两种。本文介绍手动的。 Click the Preferences > Browse Packages… menuBrowse up a folder and then into the Installed Packages/ fold…

解决 Sublime Text 中文样式显示异常问题

目录 一、问题背景 二、问题解决 1)在工具栏中选择 Preferences → Settings ,打开配置文件 2)在右侧界面添加下方代码块中的内容, CtrlS 保存 三、效果展示 一、问题背景 最近在单位的Mac系统中使用Sublime Text感觉良好&a…

sublime text里面中文字体显示异常解决方案

sublime text下载之后一开始转成中文之后,会出现中文显示异常的问题,比如下图中“门”字显示异常 通过如下的设置可以解决该问题: 首选项--》设置 在该位置添加如下内容: {"font_options": ["gdi"],"dp…