当前位置: 首页 > 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.dtcms.com/a/364160.html

相关文章:

  • 英伟达Jetson Orin NX-YOLOv8s目标检测模型耗时分析
  • 写论文先卡骨架再卡内容?一周出初稿爽翻!AI 帮我把骨架搭得明明白白,填内容超顺
  • 零样本视觉模型(DINOv3)
  • 从静态到智能:用函数式接口替代传统工具类
  • 作物改良中的综合生物技术与人工智能创新--文献精读160
  • github添加SSH密钥
  • 使用 Python 的 SymPy 进行符号计算
  • XMind2025(思维导图)下载安装教程
  • Linux 内核定时器实验
  • 2025年IT行业大学生证书选择指南
  • 机器学习:从技术原理到实践应用的深度解析
  • Steam开发者上架游戏完整指南(含具体技术细节)
  • 代码随想录---动态规划篇
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘black’问题
  • Java 大视界 --Java 大数据在智能教育学习资源整合与知识图谱构建中的深度应用(406)
  • 从Win10强制升级到Win11
  • 【数据结构探秘】手把手用单链表实现增删查改:一篇面向 C 程序员的实战指南
  • 【数通那些事】Vlan基础
  • 2025年- H109-Lc217--658. 找到 K 个最接近的元素(双指针+二分)--Java版
  • 当合规成为主旋律,PSP 如何推动链上消费市场迈向新蓝海?
  • 9月2日
  • Scikit-learn从入门到实践
  • Xcode 编译速度慢是什么原因?如何提高编译速度?
  • 英伟达Jetson Orin NX-YOLOv8n图像分类模型耗时分析
  • 《浪浪山小妖怪》知识竞赛来袭!测测你是几级影迷?
  • Java试题-选择题(29)
  • 天心:天下为公的君子之道
  • 多人协作修改文档时如何避免内容丢失
  • 【C++】迭代器详解与失效机制
  • Shell字符串操作技巧及if语句使用