当前位置: 首页 > news >正文

MySQL-表的约束(上)

表的约束

        在 MySQL 中,表的约束(Constraints)用于确保数据库中数据的完整性和一致性。它们定义了对表中数据的规则和限制,防止无效或不一致的数据被插入、更新或删除。常见的 MySQL 表约束包括主键约束(PRIMARY KEY)外键约束(FOREIGN KEY)唯一约束(UNIQUE)非空约束(NOT NULL)检查约束(CHECK)默认约束(DEFAULT)自增约束(AUTO_INCREMENT)等,这些约束可以在创建表时定义,也可以使用 ALTER TABLE 语句在已存在的表上添加或修改。合理使用约束可以大大提高数据库中数据的质量和可靠性。

        但事实上真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合 法性,从业务逻辑角度保证数据的正确性。 表的约束很多,这里主要介绍如下几个: null/not null,default, comment, zerofill,primary key,auto_increment,unique key

空属性

        在 MySQL 中,空属性(NULL/NOT NULL) 是最基础也最常用的表约束之一,用于控制列是否允许存储 NULL 值(表示 "无值" 或 "未知值")。

  • NULL:表示列允许存储空值(默认行为)
  • NOT NULL:强制列必须存储具体值,不允许为空

注意:数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办 法参与运算。

如图所示

案例:

        创建一个班级表,包含班级名和班级所在的教室。

        站在正常的业务逻辑中: 如果班级没有名字,你不知道你在哪个班级 如果教室名字可以为空,就不知道在哪上课 。

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



如图所示

        我们创建一个名为“myclass”的表来测试一下。

        然后,查看一下表的数据结构

        可以看到,我们在创建数据表的时候,定义了字段“class-name”和“class-room”not null,以及字段“other” null然后我们来测试一下这两个字段是否允许 null

        插入几组数据来做测试。

        通过测试可以发现字段“other”是允许为 null 的,而字段“class-name”和“class-room”是不允许为 null 的



默认值

        在 MySQL 中,默认值约束(DEFAULT) 用于为表中的列指定一个默认值。当向表中插入数据时,如果没有为该列提供具体值,MySQL 会自动使用默认值填充。



        我们创建一个名为“t13”的表来测试一下。

        查看一下表的数据结构

        插入几组数据来测试一下。

       查看一下插入的数据。

       我们这时插入数据是正常插入的。

       假设我们只插入name这一列。

        可以看出,这时其余两项是默认插入的,并不是用户主动插入的

        我们创建一个表再来看一下。

        查看一下这张表的数据结构。

   我们可以看到Default列是默认值。如果插入数据时没有指定该列的值,会使用默认值。name 的默认值是 NULL,但由于 name 不允许为 NULL,所以插入时必须显式指定 name 的值。age 的默认值是 18gender 的默认值是 男。

        我们不妨忽略gender和age试试。

        可以看出,我们所忽略的值都是被默认插入了。



注意:

  1. 与 NOT NULL 结合:默认值通常与 NOT NULL 一起使用,确保列既有默认值又不允许为空

    sql

  2. 函数作为默认值:MySQL 支持使用某些函数作为默认值。

  3. 插入时覆盖默认值:如果插入数据时指定了具体值,将覆盖默认值

列描述

        在 MySQL 中,“列描述” 并不是一种约束,而是用于对表中的列进行说明、注释,方便其他开发者或自己后续了解列的含义等信息。可以通过 COMMENT 关键字来为列添加描述信息。



        这部分我们就来简单了解一下。

        创建一个表来进行测试并查看一下表结构。

        插入几组数据。

        解释一下,列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA 来进行了解。



zerofill

        在 MySQL 中ZEROFILL 是一种针对数值类型列的特殊约束(更准确地说是一种格式属性),用于在数值的显示长度不足时,自动在前面补零(0)。

  • 仅影响数值的显示形式,不改变数据的实际存储值
  • 自动为列隐式添加 UNSIGNED 属性(无符号,即只能存储非负数值)


如图所示

        创建一个表,并查看一下它的表结构。

         可以看到int(10),这个代表什么意思呢?整型不是4字节码?这个10又代表什么呢?其实没有zerofill这个 属性,括号内的数字是毫无意义的。

        现在我们来插入几组数据。

        接着修改一下它的数据结构。

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

        这次可以看到b的值由原来的2变成00002,这就是zerofill属性的作用,如果宽度小于设定的宽度(这里设置的是10),自动填充0。要注意的是,这只是最后显示的结果,在MySQL中实际存储的还是1。为什 么是这样呢?我们可以用hex函数来证明。

http://www.xdnf.cn/news/1436149.html

相关文章:

  • 开发中使用——鸿蒙本地存储之收藏功能
  • LLM 能不能发展为 AGI?
  • 开源模型应用落地-模型上下文协议(MCP)-构建AI智能体的“万能插座”-“mcp-use”高级用法(十三)
  • 3.2-C++基础组件
  • 重新审视信任基石:公网IP证书对网络安全生态的影响
  • 【Go语言入门教程】 Go语言的起源与技术特点:从诞生到现代编程利器(一)
  • Cursor 教我学 Python
  • 英伟达Jetson Orin NX-YOLOv8s目标检测模型耗时分析
  • 深度集成Dify API:企业级RAG知识库管理平台解决方案
  • ts,js文件中使用 h函数渲染组件
  • 美国服务器连接速度变慢时应该着重做哪些检查?
  • 双Token实战:从无感刷新到安全防护,完整流程+代码解析
  • PostgreSQL(1) FETCH用法
  • 【MySQL体系结构详解:一条SQL查询的旅程】
  • 《一篇拿下!C++:类和对象(中)构造函数与析构函数》
  • Java 21 虚拟线程 + 分布式调度深度实战:从原理到落地,大促日志同步效率提升 367%
  • 基于SpringBoot的校园资料分享平台
  • Mysql数据库基础(上)
  • 第1章:VisualVM 简介与安装
  • 东土科技战略升级:成立半导体子公司,赋能国产半导体智能化升级
  • 基于 HTML、CSS 和 JavaScript 的智能图像锐化系统
  • HTML第五课:求职登记表
  • 【实时Linux实战系列】基于实时Linux的农业自动化系统开发
  • C++ numeric库简介与使用指南
  • 项目解析:技术实现与面试高频问题
  • Linux - 进程切换
  • Git在idea中的实战使用经验(一)
  • 【TRAE调教指南之MCP篇】Exa MCP:治疗AI幻觉的有效方案
  • 构建企业级区块链网络:基于AWS EC2的弹性、高可用解决方案
  • CICD 持续集成与持续交付