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

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唯一标识记录,确保数据唯一性每表只能有一个,可为复合主键

相关文章:

  • 嵌入式学习笔记 - STM32定时器的输入通道与时钟源
  • Vue+Vite学习笔记
  • C语言查漏补缺
  • 2025年渗透测试面试题总结-安恒[实习]安全工程师(题目+回答)
  • 中级网络工程师知识点4
  • 灵光一现的问题和常见错误2
  • 芯片生态链深度解析(二):基础设备篇——人类精密制造的“巅峰对决”
  • 劳特巴赫trace32负载率测试
  • [YOLO模型](4)YOLO V3的介绍
  • 新的节能技术和一体化解决方案,推动工厂智能升级和产业转型
  • 开源RTOS(实时操作系统):nuttx 编译
  • MyBatis 核心组件源码分析
  • 车载诊断架构 --- 核心网关流控制机制需求
  • 一个指令,让任意 AI 快速生成思维导图
  • 【单机版OCR】清华TH-OCR v9.0免费版
  • Win11下轻松搭建wiki.js,Docker.desktop部署指南(mysql+elasticsearch+kibana+wiki.js)
  • 嘉立创EDA成图:文件管理
  • C++ 蓝桥 STEMA 真题模拟测试卷一
  • 全局异常处理:如何优雅地统一管理业务异常
  • Java 方法向 Redis 里操作字符串有什么需要注意的?​
  • “马上涨价”再到“吞下关税”,美政策让沃尔玛“输两次”
  • 茅台总经理到访五粮液:面对白酒行业周期性调整,需要团结一心的合力
  • 上海公办小学验证今起开始,下周一和周二分区进行民办摇号
  • 多个“首次”!上市公司重大资产重组新规落地
  • 福州一宋代古墓被指沦为露天厕所,仓山区博物馆:已设置围挡
  • 清雪车司机未拉手刹下车导致溜车被撞亡,事故调查报告发布