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

MySQL表的约束(上)

目录

一、空属性(NULL/NOT NULL)

二、默认值(DEFAULT)

三、列描述(COMMENT)

四、Zerofill

五、主键(PRIMARY KEY)

总结


一、空属性(NULL/NOT NULL)

        默认情况下,字段允许为 NULL。但实际开发中应尽量使用 NOT NULL,避免数据参与运算时产生问题(如 NULL + 1 = NULL)。

若字段不允许为空,插入数据时必须提供值,否则会触发错误。

以下以 “员工信息表” 为例进行说明:

🌴创建 “员工信息表”

在这里,name(员工姓名)和 department(部门)字段设置了 NOT NULL 属性,即它们不允许为空。这意味着在向员工信息表插入新员工记录时,必须提供员工姓名和部门的信息,否则插入操作将失败。

🌴查看表结构

可以看到,name department 字段的 Null 列显示为 NO,表示它们不允许为空。

🌴插入记录

假设要插入一条新员工记录,例如,员工 ID 为 1,姓名为 “张三”,部门为 “销售部”,职位为 “销售经理”。可以使用以下 SQL 语句:

这条语句能够插入成功,因为 namedepartment字段都提供了非空值。

但如果尝试插入一条记录,例如,员工 ID 为 2,姓名为空,部门为 “技术部”,职位为 “软件工程师”:

这条语句将会失败,因为 name 字段被设置为 NOT NULL,而插入的值为空。

同样地,如果尝试插入一条记录,员工 ID 为 3,姓名为 “李四”,部门为空,职位为 “产品经理”:

这条语句也会失败,因为 depart字段被设置为 NOT NULL,而插入的值为空。

综上所述,在创建表时给字段设置 NOT NULL 属性,可以确保在插入数据时这些字段必须提供非空值,从而保证数据的完整性和一致性。


二、默认值(DEFAULT)

  • 当字段经常出现特定值时,可设置默认值,插入数据时可省略该字段。
  • 默认值可以是常量、表达式或函数(如 CURRENT_TIMESTAMP)。

以下以 “图书表” 为例进行说明:

🌵创建 “图书表”

在这里,status(图书状态)字段默认值为 “未借阅”,borrower(借阅者)字段默认值为空字符串。这意味着在向图书表插入新图书记录时,如果不指明图书状态或借阅者,会自动使用默认值进行填充。

🌵查看表结构

可以看到,status字段的 Default 列显示为 “未借阅”,borrower字段的 Default 列显示为空字符串。

🌵插入记录

假设要插入一条新图书记录,例如,图书 ID 为 1,书名为 “数据结构与算法”,作者为 “张三”,可以使用以下 SQL 语句:

这条语句能够插入成功,因为 statusborrower字段没有被指定值,会自动使用默认值 “未借阅” 和空字符串。

如果尝试插入一条记录,指明图书 ID 为 2,书名为 “计算机网络”,作者为 “李四”,状态为 “已借阅”,借阅者为 “王五”:

这条语句也会成功,因为指定了所有字段的值。

🌵同时设置NOT NULLDEFAULT

以创建一个 “学生表” 为例,表中包含学生姓名、学号和成绩,成绩默认为 0,且学生姓名和学号字段不允许为空。SQL 定义如下:

在这个表中,name、id字段设置了 NOT NULL 属性,score 字段设置了默认值 0。创建表后查看表结构,会发现 name、id 字段不允许为空,score 字段的默认值为 0

向表中插入数据时,如果不指明成绩,会自动使用默认值 0:

插入成功后,score 字段的值为 0。

🌵注意事项

  1. 谨慎使用默认值:默认值应该设置为合理的值,以确保数据的准确性和一致性。
  2. NOT NULLDEFAULT 的关系:设置了 DEFAULT 属性的字段,通常不需要再设置 NOT NULL,因为即使没有插入值,也会使用默认值填充,从而避免了空值的出现。
  3. 检查表结构:在创建表后,可以使用 DESC 或类似语句检查表结构,以确保默认值和 NOT NULL 约束已正确设置。

三、列描述(COMMENT)

  • 为字段添加注释,提高代码可读性,便于团队协作。
  • 注释信息通过 SHOW CREATE TABLE 查看,DESC 命令不显示。

以下以 “订单表” 为例进行说明:

🌻创建 “订单表”

在这里,每个字段后面都添加了 COMMENT 关键字,用于描述该字段的含义。例如:

  • id字段的描述是 “订单编号”。
  • orderdate字段的描述是 “订单日期”。
  • name字段的描述是 “客户名称”。

🌻查看表的创建细节

可以看到,每个字段的描述信息(COMMENT)都包含在表的创建语句中。

🌻说明

        列描述在创建表时添加,主要目的是帮助程序员或数据库管理员(DBA)更好地理解表结构和字段的含义。这对于维护和扩展数据库非常有帮助,尤其是在团队协作开发中,可以确保所有成员对表结构有一致的理解。


四、Zerofill

  • 用于数值类型的显示格式,左侧补零至指定长度。
  • 注意:不影响实际存储的值,仅为显示效果。

以下以 “书籍表” 为例进行说明:

🍇创建 “书籍表”

在这里,id字段的显示宽度设置为 5,但没有设置 ZEROFILL 属性。

🍇插入数据并查看

向表中插入一条记录,指明 idname的值分别为 1 和 “数据结构与算法”,Price 为 59.99,然后查看表中的数据:

可以看到,id字段显示为 1,并没有按照显示宽度 5 来显示。

🍇修改表结构并添加 ZEROFILL 属性

修改 id字段,添加 ZEROFILL 属性:

再次向表中插入一条记录,指明 idname的值分别为 2 和 “计算机网络”,Price 为 45.50:

查看表中的数据:

可以看到,id 字段显示为 0000100002,因为 ZEROFILL 属性会自动在数值前面填充零,使其显示宽度达到 5 位。

🍇验证底层存储

虽然 ZEROFILL 改变了数据的显示方式,但底层存储的数据仍然是原来的值。可以使用 HEX 函数查看底层存储的值:

可以看到,底层存储的值仍然是 1 和 2,ZEROFILL 只是改变了数据的显示方式。


五、主键(PRIMARY KEY)

  • 主键字段的值唯一且非空,一张表只能有一个主键。
  • 通常使用整数类型(如 INT)作为主键。

以下分别以 "员工表" 和 "库存表" 为例,对主键和复合主键进行说明。

主键案例:员工表

🍀创建员工表

🍀查看表结构

可以看到,id字段的 Key 列显示为 PRI,表示该字段是主键。

🍀插入记录

尝试插入两条记录:

第二条插入语句将会失败,因为 id为 1 的记录已经存在,主键冲突。

🍀删除主键

再次查看表结构,id字段的 Key 列的 PRI 标志将消失。

🍀添加主键

再次查看表结构,id字段的 Key 列的 PRI 标志将重新出现。


复合主键案例:库存表

🍀创建库存表

🍀查看表结构

可以看到,ProductID WarehouseID 字段的 Key 列都显示为 PRI,表示它们共同组成了复合主键。

🍀插入记录

尝试插入两条记录:

第二条插入语句将会失败,因为 ProductID 为 101 且 WarehouseID 为 1 的记录已经存在,复合主键冲突。

允许插入以下记录,因为虽然 ProductID WarehouseID 可能重复,但它们的组合不重复:

🍀查看插入的数据

可以看到,表中有重复的 ProductID 和重复的 WarehouseID,但没有重复的 ProductID WarehouseID 组合。

🍀删除复合主键

再次查看表结构,ProductID WarehouseID 字段的 Key 列的 PRI 标志将消失。

🍀添加复合主键

再次查看表结构,ProductID WarehouseID 字段的 Key 列的 PRI 标志将重新出现。


总结

约束类型作用注意事项
NOT NULL字段值不能为空避免数据运算异常
DEFAULT字段默认值仅对允许为空的字段有效
COMMENT列描述信息通过 SHOW CREATE TABLE 查看
ZEROFILL数值显示补零不影响实际存储值
PRIMARY KEY唯一标识记录,确保数据唯一性每表只能有一个,可为复合主键
http://www.xdnf.cn/news/6833.html

相关文章:

  • LeetCode 第 45 题“跳跃游戏 II”
  • Spring之Bean的初始化 Bean的生命周期 全站式解析
  • PyTorch实现CrossEntropyLoss示例
  • AIGC在电商行业的应用:革新零售体验
  • 计算机网络(1)——概述
  • Docker入门指南:镜像、容器与仓库的核心概念解析
  • Redis的Hot Key自动发现与处理方案?Redis大Key(Big Key)的优化策略?Redis内存碎片率高的原因及解决方案?
  • STM32 | FreeRTOS 递归信号量
  • C# 深入理解类(静态函数成员)
  • golang中的反射示例
  • 大模型AI原生应用效果测试与评估视频课来啦
  • Python多进程编程执行任务
  • sudo apt update是什么意思呢?
  • (3)python爬虫--Xpath
  • 2022河南CCPC(前四题)
  • pip升级或者安装报错怎么办?
  • 致敬经典 << KR C >> 之打印输入单词水平直方图和以每行一个单词打印输入 (练习1-12和练习1-13)
  • 最小二乘法拟合直线,用线性回归法、梯度下降法实现
  • SLAM定位常用地图对比示例
  • 【深度学习新浪潮】大模型时代,我们还需要学习传统机器学习么?
  • 计算机视觉与深度学习 | Python实现EMD-VMD-LSTM时间序列预测(完整源码和数据)
  • React Flow 节点事件处理实战:鼠标 / 键盘事件全解析(含节点交互代码示例)
  • 跨国应用程序的数据存储方案常见的解决方案
  • R语言空间数据处理入门教程
  • Redis——过期删除策略和内存
  • golang读、写、复制、创建目录、删除、重命名,文件方法总结
  • AI517 AI本地部署 docker微调(失败)
  • Baklib知识中台构建企业智能服务新引擎
  • 板凳-------Mysql cookbook学习 (二)
  • 【新能源轻卡行驶阻力模型参数计算实战:从国标试验到续航优化】