【mysql】—— 表的约束

news2024/11/24 3:28:24

目录

序言

(一)空属性

(二)默认值

(三)列描述

(四)zerofill

(五)主键

(六)自增长

(七)唯一键

(八)外键

总结


序言

真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。比如有一个字段是email,要求是唯一的。
 

定义:

  • 因此在数据库中,表的约束(cyonstraint)是用来定义表中数据的规则和限制的规则。它们用于确保数据的完整性和一致性,并防止非法数据的插入、更新或删除。通过定义约束,可以强制执行特定的条件和规定,以确保数据的正确性和质量。

常见的表约束类型包括:

  1. 主键约束(Primary Key Constraint):定义一列或一组列作为唯一标识表中的每一行。主键用于确保唯一性和数据的完整性。

  2. 唯一约束(Unique Constraint):确保一列或一组列中的所有值都是唯一的,但可以有空值。它防止重复的数据。

  3. 外键约束(Foreign Key Constraint):用于确保表之间的关系的完整性。它定义了对其他表中的主键或唯一键的引用,可以用于建立表之间的关联。

  4. 非空约束(Not Null Constraint):指定一列不允许包含空值(NULL)。它确保必须为该列提供值。

  5. 默认约束(Default Constraint):定义一列的默认值,如果在插入新行时没有提供该列的值,则将使用默认值。

  6. 检查约束(Check Constraint):定义一列的取值范围或条件。它用于限制该列可以接受的数据。

这些约束可以单独应用于列或多个列,也可以组合使用。通过使用表的约束,可以在数据库层面上对数据进行验证和限制,以提高数据的完整性和一致性。


(一)空属性

  1. 两个值:null(默认的)和not null(不为空)
  2. 数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法参与运算

 

案例:
创建一个班级表,包含班级名和班级所在的教室。
站在正常的业务逻辑中:

  1. 如果班级没有名字,你不知道你在哪个班级
  2. 如果教室名字可以为空,就不知道在哪上课

所以我们在设计数据库表的时候,一定要在表中进行限制,满足上面条件的数据就不能插入到表中。这就是“约束”。
 

  •  插入数据时,没有给教室数据插入失败:

 


(二)默认值

在 MySQL 中,可以使用默认值约束(Default Constraint)来为表中的列指定默认值。这样,在插入新行时,如果没有提供该列的具体值,将自动使用默认值。

以下是一个示例,创建一个带有默认值约束的 users 表:

  • 在上述示例中,name email 列都被定义为具有默认值。当插入数据时,如果不提供指定列的值,则会自动使用默认值。 

默认值的生效:数据在插入的时候不给该字段赋值,就使用默认值
 

 

其次。如果要修改现有表中的列的默认值,可以使用 ALTER TABLE 命令:

 


(三)列描述

在 MySQL 中,可以使用列描述(Column Description)来为表中的列添加描述信息。列描述是一个可选的元数据属性,用于提供关于列的更多详细信息,如列的用途、含义或任何其他相关说明。

以下是一个示例,创建一个带有列描述的 t1表:

 

通过desc查看不到注释信息:
 

 通过show可以看到:

 

 


(四)zerofill

在 MySQL 中,ZEROFILL 是一种表约束,用于在存储数值类型的列中填充零以达到指定的位数。它将使数值在显示时占据固定的位数,并在必要时用零填充不足的部分。

要使用 ZEROFILL 约束,您需要将其与数值列一起使用,如 INTBIGINTFLOATDOUBLE 等。在列定义中,通过添加 ZEROFILL 关键字并指定所需的位数,来启用零填充。

 可以看到int(10),这个代表什么意思呢?整型不是4字节码?这个10又代表什么呢?其实没有zerofill这个属性,括号内的数字是毫无意义的。a和b列就是前面插入的数据,如下:
 

 

但是对列添加了zerofill属性后,显示的结果就有所不同了。修改 t2 表的属性:
 

 

对a列添加了zerofill属性,再进行查找,返回如下结果:
 

【结论】 

  •  这次可以看到a的值由原来的1变成00001,这就是zerofill属性的作用,如果宽度小于设定的宽度,自动填充0。要注意的是,这只是最后显示的结果,在MySQL中实际存储的还是1。

为什么是这样呢?我们可以用hex函数来证明:

 

 

  • 可以看出数据库内部存储的还是1,00001只是设置了zerofill属性后的一种格式化输出而已。
     

紧接着,我们把 a中的 int() 中的值改为5之后,在来进行插入操作:

 插入操作如下:

【结论】 

 当我们查看当前表时,可以发现一个问题:

  1. 当我们插入的小于5位时,缺少的用0补齐;
  2. 当超过五位时,系统就按照插入的数据原样的输出

最后解答为什么我们创建的默认是 int(10)?

  1. 首先,因为我们创建的类型是 unsigned类型,而 unsigned 的取值范围为【0,2^32-1】;
  2. 而 2^32-1 的数值范围是 10位整数,因此当我们查看时默认的是 int(10)

 小结:使用 ZEROFILL 约束可以方便地进行数字显示和格式化,特别适用于需要固定位数的标识符或编码的情况。


(五)主键

在 MySQL 中,主键约束(Primary Key Constraint)用于定义表中一列或多列作为唯一标识表中的每一行的约束条件。主键约束是一种重要的约束,用于确保数据的唯一性和完整性。

主键约束有以下特点:

  1. 唯一性:主键的值在整个表中必须是唯一的,即每一行的主键值都不相同。
  2. 非空性:主键列的值不能为 NULL,即主键列不能为空。
  3. 唯一标识性:主键用于唯一标识表中的每一行,从而方便对表中的数据进行准确定位和关联。

【案例】

  • 创建表的时候直接在字段上指定主键
     

  •  主键约束:主键对应的字段中不能重复,一旦重复,操作失败。

  •  当表创建好以后但是没有主键的时候,可以再次追加主键

 

  • 删除主键
     

 

  • 复合主键
     

在创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段
作为主键,可以使用复合主键
 

 

 

通过指定主键约束,可以确保表中的数据具有唯一的标识,并对数据的完整性进行验证和保护。


(六)自增长

在 MySQL 中,自增长(Auto_increment)是一种用于表的列的约束,它允许数据库自动为每个新插入的行分配唯一的递增值。自增长列通常用作表的主键列,以确保每个新插入的行都具有唯一且递增的标识符。

auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。


自增长的特点:

  1. 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
  2. 自增长字段必须是整数
  3. 一张表最多只能有一个自增长
     

【案例】

 

在插入后获取上次插入的 AUTO_INCREMENT 的值(批量插入获取的是第一个值)
 

【 索引】

在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结
构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。


索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。
数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。

通过自增长约束,可以轻松生成并维护具有唯一标识的行,减少了手动提供标识符的工作和可能的冲突。自增长列通常用作主键列,以实现高效的数据插入和查找。


(七)唯一键

在 MySQL 中,唯一键(Unique Key)是一种约束,用于确保表中的列或列组合的值在整个表中是唯一的。唯一键约束类似于主键约束,但它允许空值(NULL),并且可以应用于多个列。

唯一键约束有以下特点:

  1. 唯一性:唯一键的值在整个表中必须是唯一的,即每一行的唯一键值都不能与其他行的唯一键值重复。
  2. 可以包含 NULL 值:唯一键列允许包含 NULL 值。由于 NULL 不等于 NULL,因此两个包含 NULL 值的行不会违反唯一键约束。

关于唯一键和主键的区别:

  1. 我们可以简单理解成,主键更多的是标识唯一性的;
  2. 而唯一键更多的是保证在业务上,不要和别的信息出现重复。
     

 

  • 唯一约束不能重复,但可以为空:
     

 

通过使用唯一键约束,可以确保表中的列或列组合具有唯一的值,从而确保数据的完整性和一致性。与主键约束相比,唯一键约束允许空值,并且可以应用于多个列,提供更大的灵活性。


(八)外键

在 MySQL 中,外键(Foreign Key)是一种约束,用于确保表之间的数据完整性和一致性。外键定义了表之间的关联关系,它基于一个表中的列值与另一个表中的列值之间的关系。

外键约束有以下特点:

  1. 关联关系:外键约束用于定义表之间的关联关系,其中一个表(称为子表)的列值必须存在于另一个表(称为父表)的列值中。
  2. 数据完整性:外键约束确保关联的数据在父表中存在,从而保持数据的完整性和一致性。它防止在子表中插入无效的或不一致的数据。
  3. 可选性:外键列可以为空或包含 NULL 值,但如果包含值,则该值必须在父表中存在。

要使用外键约束,需要满足以下条件:

  1. 子表和父表之间必须存在关联的列,子表中的列用于引用父表中的列。
  2. 父表中的关联列必须具有唯一约束或主键约束。

语法

  • foreign key (字段名) references 主表(列)

【案例】

 对上面的示意图进行设计:

  • 先创建主键表
     

 

  • 再创建从表:

  •  正常进行插入数据:

  •  插入一个班级号为30的学生,因为没有这个班级,所以插入不成功:

  •  插入班级id为null,比如来了一个学生,目前还没有分配班级:

  •  如何理解外键约束:

首先我们承认,这个世界是数据很多都是相关性的。


理论上,上面的例子,我们不创建外键约束,就正常建立学生表,以及班级表,该有的字段我们都有。


此时,在实际使用的时候,可能会出现什么问题?

  1. 有没有可能插入的学生信息中有具体的班级,但是该班级却没有在班级表中?
  2. 比如一个年级只开了26个班,但是在上课的学生里面竟然有27班的学生(这个班目前并不存在),这很明显是有问题的。


因为此时两张表在业务上是有相关性的,但是在业务上没有建立约束关系,那么就可能出现问题。


解决方案就是通过外键完成的。建立外键的本质其实就是把相关性交给mysql去审核了,提前告诉mysql表之间的约束关系,那么当用户插入不符合业务逻辑的数据的时候,mysql不允许你插入。
 

通过使用外键约束,可以确保表之间的关联关系,并保持数据的完整性。它可以防止插入无效的引用数据或导致不一致的数据。外键约束是维护表之间关系的重要工具,并有助于确保关联数据的一致性。


总结

以上便是关于mysql表的约束的全部内容了。接下来,简单的回顾下本文内容!!!

  1. 在 MySQL 中,表的约束用于定义和保护数据的完整性和一致性。
  2. 这些约束可以在创建表时指定,也可以使用 alter table 语句添加、修改或删除;
  3. 它们帮助确保表中的数据满足特定的规则和关联条件,提供了数据的一致性和完整性保证;
  4. 根据实际需求和数据模型设计,可以结合使用不同类型的约束来实现所需的业务逻辑和数据限制。

到此,关于本文便讲解完毕了。感谢大家的观看与支持!!!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/868623.html

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

相关文章

git命令使用

君子拙于不知己,而信于知己。——司马迁 清屏:clear 查看当前面板的路径:pwd 查看当前面板的文件:ls 创建文件夹:mkdir 文件夹名 创建文件:touch 文件名 删除文件夹:rm -rf 文件夹名 删除文件:r…

【双指针_盛最多水的容器_C++】

题目解析 盛最多水的容器 算法原理 向内枚举: weight一定会减小 height不是不变就是减小要求的是盛水最多的容器,那么这些枚举情况就不需要。 拿比较小的数去向内枚举,v一直在减小,所以说直接排除 编写代码 class Soluti…

【rust/egui】(一)从编译运行template开始

说在前面 rust新手,egui没啥找到啥教程,这里自己记录下学习过程环境:windows11 22H2rust版本:rustc 1.71.1egui版本:rust windows安装参考:这里本文默认读者已安装相关环境(git、vscode等) 关于egui egui …

[数据集][目标检测]钢材表面缺陷目标检测数据集VOC格式2279张10类别

数据集格式:Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件,仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数):2279 标注数量(xml文件个数):2279 标注类别数:10 标注类别名称:["yueyawan",&…

【变形金刚02】注意机制以及BERT 和 GPT

一、说明 我已经解释了什么是注意力机制,以及与转换器相关的一些重要关键字和块,例如自我注意、查询、键和值以及多头注意力。在这一部分中,我将解释这些注意力块如何帮助创建转换器网络,注意、自我注意、多头注意、蒙面多头注意力…

Mysql中如果建立了索引,索引所占的空间随着数据量增长而变大,这样无论写入还是查询,性能都会有所下降,怎么处理?

索引所占空间的增长确实会对MySQL数据库的写入性能和查询性能造成影响,这主要是由于索引数据过多时会导致磁盘I/O操作变得非常频繁,从而使性能下降。为此,可以采取以下几种方式来减缓这种影响: 1. 限制索引的大小:可以…

【已成功解决】使用vpn/代理后无法正常上网/无法正常访问网站

文章目录 一、问题描述二、解决步骤三、原因分析 一、问题描述 很多同学在学习访问学校提供的资源时或者一些小伙伴在公司办公时需要使用VPN。但是当我们关闭VPN后,却发现没有办法正常连接到互联网了。 可以尝试以下方法解决,至于导致这种情况发生的原可…

SpringBoot携带Jdk绿色部署项目

文章目录 SpringBoot携带Jdk绿色部署运行项目1. 实现步骤2. 自测项目文件目录及bat文件内容,截图如下:2-1 项目文件夹列表:2-2. bat内容 SpringBoot携带Jdk绿色部署运行项目 说明: 实际应用的不方便场景:1. 实际项目…

Vue.js2+Cesium1.103.0 十、加载 Three.js

Vue.js2Cesium1.103.0 十、加载 Three.js Demo ThreeModel.vue <template><divid"three_container"class"three_container"/> </template><script> /* eslint-disable eqeqeq */ /* eslint-disable no-unused-vars */ /* eslint…

Python爬虫-抓取的目标数据为#x开头,怎么解决?

前言 本文是该专栏的第4篇,后面会持续分享python爬虫案例干货,记得关注。 在做爬虫项目的时候,有时候抓取的平台目标数据为&#x开头,如下图所示: 浏览器显示的正常数据,但通过爬虫协议获取到的网页源码数据却是以&#x开头的隐藏数据,遇到这种情况,爬虫需要怎么处…

基于扩频的数字视频水印嵌入和检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ................................................................. for j 1:length(attens…

Google FixMatch:SOTA 在半监督学习基准测试中的性能

作为当前计算机视觉应用的首选&#xff0c;深度网络通常通过监督学习&#xff08;一种需要标记数据集的方法&#xff09;来实现其强大的性能。尽管人工智能多年来取得了许多成就和进步&#xff0c;但标记数据的关键任务仍然落在人类专家身上。他们很难满足那些数据饥渴的深度网…

智慧工地管理平台源码,Spring Cloud +Vue+UniApp框架开发

智慧工地源码 智慧工地云平台源码 智慧建筑源码 互联网建筑工地&#xff0c;是将互联网的理念和技术引入建筑工地&#xff0c;从施工现场源头抓起&#xff0c;最大程度的收集人员、安全、环境、材料等关键业务数据&#xff0c;依托物联网、互联网&#xff0c;建立云端大数据管…

【C++】透过STL源码深度剖析及模拟实现vector

鉴于读者的响应&#xff0c;打算将文章拆分一下&#xff0c;方便观看&#xff0c;基本接口可看 深入浅出STL之vector类 一、源码引入 以下我所介绍的都是基于【SGI】版本的STL&#xff0c;对源码有兴趣的同学可以去看看 侯捷老师的《STL源码剖析》 然后呢我们就去调出【vector…

引用.so库,JNI使用方法

1、先将.so库放在libs下&#xff1a; 2、在工程模块下 的build.gradle配置&#xff1a; android的defaultConfig配置 不同的系统平台看项目需要 3、生成与so库中c文件的jni方法的一样包名的实体类以及方法 如C文件暴露的方法&#xff1a; 生成的类和包名对应为&#xff1a; …

Python-OpenCV中的图像处理-模板匹配

Python-OpenCV中的图像处理-模板匹配 模板匹配单对象的模板匹配多对象的模板匹配 模板匹配 使用模板匹配可以在一幅图像中查找目标函数&#xff1a; cv2.matchTemplate()&#xff0c; cv2.minMaxLoc()模板匹配是用来在一副大图中搜寻查找模版图像位置的方法。 OpenCV 为我们提…

Fast SAM与YOLOV8检测模型一起使用实现实例分割

Fast SAM与YOLOV8检测模型一起使用 部分源代码在结尾处可获取 晓理紫 1 使用场景 实例分割数据集的获取要比检测数据的获取更加困难&#xff0c;在已有检测模型不想从新标注分割数据进行训练但是又想获取相关物体的mask信息以便从像素级别对物体进行操作&#xff0c;这时就可以…

【JavaEE进阶】SpringBoot项目的创建

文章目录 一. SpringBoot简介1. 什么是SpringBoot?2. SpringBoot的优点 二. SpringBoot项目创建1. 使用IDEA创建2. 使用网页创建SpringBoot项目 三. 运行SpringBoot项目 一. SpringBoot简介 1. 什么是SpringBoot? Spring Boot 是一个用于快速构建基于 Spring 框架的应用程序…

使用 PyTorch 逐步检测单个对象

一、说明 在对象检测任务中&#xff0c;我们希望找到图像中对象的位置。我们可以搜索一种类型的对象&#xff08;单对象检测&#xff0c;如本教程所示&#xff09;或多个对象&#xff08;多对象检测&#xff09;。通常&#xff0c;我们使用边界框定义对象的位置。有几种方法可以…

概率论与数理统计:第四章:随机变量的数字特征

文章目录 Ch4. 随机变量的数字特征1. 数学期望E(X)(1)数学期望的概念1.离散型①一维离散型随机变量X的数学期望&#xff1a; E X EX EX②一维离散型随机变量的函数的期望&#xff1a; E [ g ( X ) ] E[g(X)] E[g(X)]③二维离散型随机变量的函数的期望&#xff1a; E [ g ( X , …