【mysql】—— 表的约束

目录

序言

(一)空属性

(二)默认值

(三)列描述

(四)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.mfbz.cn/a/71278.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

stm32_断点调试无法进入串口接收中断

先说结果,可能是stm32调试功能/keil软件/调试器(试过STLINK和JLINK两种)的问题,不是代码; 1、入坑 配置完串口后,可以发送数据到串口助手,但不能接收数据并做处理,所以第一步&…

安全防御(3)

1.总结当堂NAT与双机热备原理,形成思维导图 2.完成课堂nat与双机热备试验 引用IDS是指入侵检测系统,它可以在网络中检测和防御入侵行为。IDS的签名是指根据已知入侵行为的特征制定的规则,用于检测和警告可能存在的入侵行为。签名过滤器可以根…

图论——最短路算法

引入&#xff1a; 如上图&#xff0c;已知图G。 问节点1到节点3的最短距离。 可心算而出为d[1,2]d[2,3]112,比d[1,3]要小。 求最短路径算法&#xff1a; 1.Floyd(弗洛伊德) 是一种基于三角形不等式的多源最短路径算法。边权可以为负数 表现为a[i,j]a[j,k]<a[i,k]。 …

9.2.2Socket(TCP)

一.过程: 1.建立连接(不是握手),虽然内核中的连接有很多,但是在应用程序中,要一个一个处理. 2. 获取任务:使用ServerSocket.accept()方法,作用是把内核中的连接获取到应用程序中,这个过程类似于生产者消费者模型. 3. 使用缓冲的时候,注意全缓冲和行缓冲. 4.注意关闭文件资源…

排序算法(二)

1.希尔排序-Shell Sort 1.算法原理 将未排序序列按照增量gap的不同分割为若干个子序列&#xff0c;然后分别进行插入排序&#xff0c;得到若干组排好序的序列&#xff1b; 缩小增量gap&#xff0c;并对分割为的子序列进行插入排序&#xff1b;最后一次的gap1&#xff0c;即整个…

SQL 基础查询

msyql 不区分大小写 DDL 数据定义语言 查询 show databases create database db01 创建数据库 create database if not exists db01 创建数据库 删除数据库 drop database if exists db01 使用数据库 use 数据库名 CREATE TABLE tb_user(id int PRIMARY KEY COMMENT i…

简单易用且高效的跨平台开发工具:Xojo 2023 for Mac

Xojo for Mac是Mac平台上一个跨平台的针对桌面、Web、移动和Raspberry Pi的快速应用程序开发软件。与其他多平台开发工具相比&#xff0c;Xojo for Mac为开发人员提供了显着的生产率提高。 Xojo for Mac具有拖放功能&#xff0c;使您能够快速创建用户界面设计&#xff0c;然后…

【Linux初阶】进程间通信介绍 管道

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【Linux初阶】 ✒️✒️本篇内容&#xff1a;进程间通信介绍&#xff0c;管道概述&#xff0c;匿名管道应用&#xff0c;命名管道应用 &#x1f6a2;&#…

如何在 Spring Boot 中集成日志框架 SLF4J、Log4j

文章目录 具体步骤附录 笔者的操作环境&#xff1a; Spring Cloud Alibaba&#xff1a;2022.0.0.0-RC2 Spring Cloud&#xff1a;2022.0.0 Spring Boot&#xff1a;3.0.2 Nacos 2.2.3 Maven 3.8.3 JDK 17.0.7 IntelliJ IDEA 2022.3.1 (Ultimate Edition) 具体步骤 因为 …

HTTP代理编程:Python实用技巧与代码实例

今天我要与大家分享一些关于HTTP代理编程的实用技巧和Python代码实例。作为一名HTTP代理产品供应商&#xff0c;希望通过这篇文章&#xff0c;帮助你们掌握一些高效且实用的编程技巧&#xff0c;提高开发和使用HTTP代理产品的能力。 一、使用Python的requests库发送HTTP请求&a…

【ElasticSearch入门】

目录 1.ElasticSearch的简介 2.用数据库实现搜素的功能 3.ES的核心概念 3.1 NRT(Near Realtime)近实时 3.2 cluster集群&#xff0c;ES是一个分布式的系统 3.3 Node节点&#xff0c;就是集群中的一台服务器 3.4 index 索引&#xff08;索引库&#xff09; 3.5 type类型 3.6 doc…

STM32F429IGT6使用CubeMX配置串口通信

1、硬件电路 2、设置RCC&#xff0c;选择高速外部时钟HSE,时钟设置为180MHz 3、配置USART1引脚 4、生成工程配置 5、部分代码 //重定向printf函数 int fputc(int ch, FILE *f) {HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);return ch; } /* USER CODE BE…

Mac M1 安装Oracle Java 与 IEDA

文章目录 1 官网下载2 安装IDEA参考 1 官网下载 https://www.oracle.com/ 使用finder中的拖拽进行安装即可 2 安装IDEA https://www.jetbrains.com/zh-cn/idea/download/?sectionmac 同样的&#xff0c;下载完后拖拽安装即可 参考 Mac M1 安装Java 开发环境 https://blog.…

cuda+anaconda+pytorch按照教程

首先安装显卡对应的CUDA版本&#xff0c;关键点在于区别显卡支持的CUDA最高版本和运行版本 1、查看当前显卡支持的最高版本&#xff0c;有两种方式&#xff1a; 1&#xff09;NVIDIA控制面板—>帮助—>系统信息—>组件—>NVCUDA.dll对应版本 请注意&#xff0c;12…

快速上手React:从概述到组件与事件处理

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

React源码解析18(1)------ React.createElement 和 jsx

1.React.createElement 我们知道在React17版本之前&#xff0c;我们在项目中是一定需要引入react的。 import React from “react” 即便我们有时候没有使用到React&#xff0c;也需要引入。原因是什么呢&#xff1f; 在React项目中&#xff0c;如果我们使用了模板语法JSX&am…

Spring-1-深入理解Spring XML中的依赖注入(DI):简化Java应用程序开发

学习目标 前两篇文章我们介绍了什么是Spring,以及Spring的一些核心概念&#xff0c;并且快速快发一个Spring项目&#xff0c;以及详细讲解IOC&#xff0c;今天详细介绍一些DI(依赖注入) 能够配置setter方式注入属性值 能够配置构造方式注入属性值 能够理解什么是自动装配 一、…

【C语言】每日一题---1

大家好&#xff0c;我是苏貝&#xff0c;本篇博客是系列博客每日一题的第一篇&#xff0c;本系列的题都不会太难&#xff0c;如果大家对这种系列的博客感兴趣的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 下面代码的结果是&#xff1a; #include <…

【Nginx】Nginx负载均衡

负载均衡&#xff1a;通过反向代理来实现 Nginx的七层代理和四层代理&#xff1a; 七层是最常用的反向代理方式&#xff0c;只能配置在nginx配置文件的http模块当中 &#xff1b;配置的方法名称为&#xff1a;upstream模块&#xff0c;不能写在server中也不能写在location中&a…

爬虫ip池越大越好吗?

作为一名资深的程序员&#xff0c;今天我要给大家分享一些关于爬虫ip池的知识。关于ip代理池的问题&#xff0c;答案是肯定的&#xff0c;池子越大越好。下面跟我一起来盘点一下ip池大的好处吧&#xff01; 1、提高稳定性 爬虫ip池越大&#xff0c;意味着拥有更多可用的爬虫ip…
最新文章