MySQL 数据库约束

目录

一、数据库约束 

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://www.mzph.cn/news/7363.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【梦辛工作室】IF判断优化、责任链模式 IfChain

大家好哇,我是梦辛工作室的灵,在最近的开发中,有许多需要判断的分支处理,且处理内容较多且复杂,代码就容易越写越复杂,导致后期无法继续更新跌打,然后基于这个环境,我用责任链模式写…

Stable Diffusion在各种显卡上的加速方式测试,最高可以提速211.2%

Stable Diffusion是一种基于扩散模型的图像生成技术,能够从文本生成高质量的图像,适用于CG,插图和高分辨率壁纸等领域。 但是它计算过程复杂,使得它的生成速度较慢。所以研究人员就创造了各种提高其速度的方式,比如Xf…

计算机视觉(二)图像特征提取

文章目录 颜色特征量化颜色直方图适用颜色空间:RGB、HSV等颜色空间操作 几何特征边缘 Edge边缘定义边缘提取 基于关键点的特征描述子引入几何特征:关键点几何特征:Harris角点FAST角点检测几何特征:斑点局部特征:SIFT预…

idea中Easy Code模版配置

首先找到模版位置 找到使用的模版,我用的是MybatisPlus-H,这是我新建的一个模版 controller.java.vm模版 ##导入宏定义 $!{define.vm}##设置表后缀(宏定义) #setTableSuffix("Controller")##保存文件(宏定义&#xff…

qemu搭建arm环境以及文件共享

几乎完全参照该文章 使用QEMU搭建ARM64实验环境 - 简书 ubuntu 14.04,linux3.16, busybox-1.31.0 arm-linux-gnueabi-gcc -v linux3.16以及busybox下载安装可参考链接 Ubuntu14.04安装qemu,运行linux-3.16gdb调试_qemu 安装 ubuntu 14_这个我…

【数学建模】相关是一个距离指标吗?

一、说明 本文探讨最平凡的数学模型--距离模型。我们知道,任何数学模型如果是个距离模型,那么它是:放心的、自动的、不加任意条件的指标项目。然而另一些度量参数不是距离空间,因此,使用起来必须外加若干条件&#xff…

一款好用的思维导图软件drawio

最近需要画思维导图,结果发现既然被人用来收费了。所以记录一下,免得大家上当。 首先说明,这个东东在github上是免费开源的,收费的是一些不法分子搞得。下面是收费版本得界面。 开源地址: https://github.com/jgraph…

JUC并发编程之CompletableFuture详解

目录 1.Future接口 1.1 Future介绍 1.1.1 FutureTask 1.1.2 代码示例 2. CompletableFuture 2.1 基本概念 2.2 代码示例 2.2.1 创建CompletableFuture 2.2.2 函数式接口(补充) 2.2.3 异步任务组合 1.Future接口 1.1 Future介绍 JUC并发编程中的…

二叉树题目:从根到叶的二进制数之和

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题:从根到叶的二进制数之和 出处:1022. 从根到叶的二进制数之和 难度 3 级 题目描述 要求 给你二叉树…

Git标签管理(对版本打标签,起别名)

tag 理解标签创建标签git tag [name]git show [tagname] 操作标签删除标签git tag -d < tagname > 推送某个标签到远程git push origin < tagname > 理解标签 标签 tag &#xff0c;可以简单的理解为是对某次 commit 的⼀个标识&#xff0c;相当于起了⼀个别名。 …

C# winform子窗口向父窗口传值

这里我使用一个简单的方法。只需要在父窗口定义一个静态变量就行。 父窗体为Form1,子窗体为Form2。 public static int get_num0; 子窗体直接给get_num赋值即可。 Form1.get_num2; 这样父窗体就能获得get_num修改后这个值了

游戏引擎UE如何革新影视行业?创意云全面支持UE云渲染

虚幻引擎UE&#xff08;Unreal Engine&#xff09;作为一款“殿堂级”的游戏引擎&#xff0c;占据了全球80%的商用游戏引擎市场&#xff0c;但如果仅仅将其当做游戏开发的工具&#xff0c;显然是低估了它的能力。比如迪士尼出品的电视剧《曼达洛人》、电影《狮子王》等等都使用…

Matlab 点云曲面特征提取

文章目录 一、简介二、实现代码2.1基于k个邻近点2.2基于邻近半径参考资料一、简介 这里基于每个点的邻域协方差来获取点云中具有的曲面几何特征的点,计算方式如下图所示: 二、实现代码 2.1基于k个邻近点 SurfaceVar.m %% *******</

【网络代理】(三)Docker+Haproxy 搭建四层代理

目录 1.1 创建 web 服务器镜像 1.2 启动 web 服务器容器 2.1 编写 haproxy 配置文件 2.2 拉取 haproxy 镜像 2.3 启动 haproxy 容器 3.1 访问 8000 端口 3.2 查看 web 服务器容器日志 附录&#xff1a;haproxy 仪表板 1.1 创建 web 服务器镜像 编写一个 Docke…

uniapp实战

上面是tab栏&#xff0c;下面是swiper&#xff0c;&#xff0c;tab和swiper和 红色滑块 动态变化&#xff0c;&#xff0c; 遇到的问题&#xff1a; 往下滚动 tab栏 吸顶&#xff1a; position:sticky; z-index:99; top:0;swiper切换触发 change 事件&#xff0c; :current …

Golang GORM 模型定义

模型定义 参考文档&#xff1a;https://gorm.io/zh_CN/docs/models.html 模型一般都是普通的 Golang 的结构体&#xff0c;Go的基本数据类型&#xff0c;或者指针。 模型是标准的struct,由Go的基本数据类型、实现了Scanner和Valuer接口的自定义类型及其指针或别名组成&#x…

Android TelephonyManager双卡获取数据开启状态异常的可能原因

背景 应用内不指定subId获取数据状态可能会错误&#xff0c;因为可能拿到voice的能力&#xff0c;而非data。 代码逻辑 1、通过TelephonyManager的isDataEnabled()没有指定subId时&#xff0c;调用内部方法isDataEnabledForReason&#xff0c;传入getId()参数以指定subid&am…

FUNBOX_SCRIPTKIDDIE靶机详解

FUNBOX_SCRIPTKIDDIE靶机复盘 这个靶场给了太多的干扰因素&#xff0c;当你打完后反过来再看是非常简单的一个靶场&#xff0c;但是你打的过程中却会觉得非常难&#xff0c;干扰因素实在天多了。 题目中给了说加一条hosts&#xff0c;实际没用上。 对IP进行一个单独扫描后发现…

机器学习深度学习——torch.nn模块

机器学习&&深度学习——torch.nn模块 卷积层池化层激活函数循环层全连接层 torch.nn模块包含着torch已经准备好的层&#xff0c;方便使用者调用构建网络。 卷积层 卷积就是输入和卷积核之间的内积运算&#xff0c;如下图&#xff1a; 容易发现&#xff0c;卷积神经网…

uniapp 微信小程序 placeholder字体、颜色自定义

效果图&#xff1a; 1、template <input type"text" placeholder"搜索标题" placeholder-class"placeholder-style"></input>2、style .placeholder-style{color: #2D94FF; }