深入解析:MYSQL-表的约束(上)
目录
1.非空约束(NOT NULL)+ 默认值(DEFAULT)
3. 空约束(NULL,默认状态)+ 默认值(DEFAULT)
表的约束表中一定要有各种约束,通过约束让我们未来插入数据库表中的数据是符合预期的约束的,本质是通过技术手段倒逼程序员插入正确的数据,反过来站在数据库的视角上,凡是插入进去的数据,都应该符合数据约束的约束的,最终目的就是保证数据的完整性和可预期性,因此我们需要更多的约束条件。
空约束
NULL与‘’;NULL表示什么都没有,而‘’则表示空串,无内容。
非空约束(NOT NULL Constraint)
强制字段必须填写具体值,不允许存储空值(NULL),是最常用的约束之一。
- 核心作用:确保关键信息的完整性,避免因字段值缺失导致数据无效或业务逻辑错误。
- 示例:在“用户表”中,“用户手机号”“身份证号”等字段必须设置非空约束,因为每个用户都必须有唯一的手机号/身份证号,空值会导致无法识别用户身份。
- 效果:若插入或修改数据时,该字段未填写值(或明确写为NULL),数据库会直接拒绝操作并报错。
2. 空约束(NULL Constraint)
允许字段存储空值(NULL),即字段值可以“无意义/未填写”,是数据库字段的默认状态(若未明确设置非空约束,字段默认允许为空)。
- 核心作用:用于存储非必需的、可后续补充的信息,避免强制填写不必要的数据。
- 示例:在“用户表”中,“用户的备用邮箱”“兴趣爱好”等字段可设置为空约束,因为部分用户可能没有备用邮箱或不愿填写兴趣爱好,空值在此处是合理的。
设置了非空约束,及未来不为空,若插入数据,便能够插入进去,如果是非空约束,同时我们设立了default,我们不传入数据,也会使用default进行默认初始化
默认约束
1.非空约束(NOT NULL)+ 默认值(DEFAULT)
- 核心逻辑:字段不允许空值,若插入数据时未给该字段赋值,数据库自动用默认值填充。
- 适用场景:字段是必需信息,但存在“通用默认状态”,无需每次手动填写。
2. 非空约束(NOT NULL)+ 无默认值
- 核心逻辑:字段不允许空值,且无通用默认值,插入数据时必须手动给该字段赋值,否则数据库报错。
- 适用场景:字段是关键唯一信息,无默认规律,需用户/业务逻辑明确提供。
3. 空约束(NULL,默认状态)+ 默认值(DEFAULT)
- 核心逻辑:字段允许空值,但为了避免“不必要的空值”,若未赋值则用默认值填充;若业务需要明确记录“无数据”,也可手动赋值为 NULL。
- 适用场景:字段非必需信息,但希望大多数情况下有合理默认值,仅少数场景需留空。
4. 空约束(NULL,默认状态)+ 无默认值
- 核心逻辑:字段允许空值,且无默认值,若插入数据时未赋值,字段直接存储为 NULL(代表“数据缺失/未知”)。
- 适用场景:字段是非必需信息,且无通用默认值,空值本身有业务意义(即“未填写/未知”)。
zerofill
ZEROFILL 是 MySQL 数据库中用于数值类型字段的一个属性,主要作用是格式化数值的显示形式,让数值在查询结果中按照指定宽度显示,不足部分用 0 填充在前面 。以下从核心要点、使用场景、实际效果等角度详细拆解:
1. 基础作用与原理
- 核心功能:给数值字段设置 ZEROFILL 后,查询结果里数值的显示宽度会被“补 0 对齐”。比如定义 int(5) ZEROFILL ,存的是 1 ,查询就会显示 00001 。
- 不改变实际存储: ZEROFILL 只影响显示效果,不会改变数据在数据库里的真实存储值。用 HEX() 函数查存储内容,能发现本质还是原始数值(如存 1 , HEX 结果仍是代表 1 的编码 )。
2. 关联特性: UNSIGNED (无符号)
MySQL 里 ZEROFILL 必须和 UNSIGNED 搭配使用(语法上要求)。因为 ZEROFILL 设计初衷是处理非负整数的格式化,搭配 UNSIGNED 能明确数值范围,也避免符号和补 0 逻辑冲突。
如果设为有符号,()内数值+1;用于表示符号位。
3. 语法与示例(以 MySQL 为例)
sql
-- 建表时设置 ZEROFILL
CREATE TABLE test_table (
id INT(5) UNSIGNED ZEROFILL DEFAULT NULL
);
-- 插入数据
INSERT INTO test_table (id) VALUES (1), (10), (100);
-- 查询结果
SELECT * FROM test_table;
-- 输出:
-- id
-- 00001
-- 00010
-- 00100
4. 注意事项
- 仅影响显示:别误以为 ZEROFILL 会改变数据存储,它本质是“显示层”的格式化,实际计算、存储都基于原始数值。
- 版本与兼容性:虽 MySQL 长期支持,但从规范和通用设计看,复杂格式化(如补 0 )更建议在应用程序端处理(灵活度更高,也避免数据库职责过重 )。
简单说, ZEROFILL 就是 MySQL 里给数值“补前导 0 做格式化”的工具,适合需固定宽度显示数字的场景,不过现代开发中,更多会选在程序里处理这类格式化需求 。
主键
主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型。
主键的关键特性和作用如下:
- 唯一性:表中任意两条记录的主键值都不重复,例如“学生表”中的“学号”。
- 非空性:主键字段不能有NULL(空值),必须为每条记录分配一个有效标识。
- 索引作用:数据库会自动为主键创建索引,大幅提升基于主键的查询、修改和删除操作效率。
- 关联基础:作为表与表之间建立关联(如外键关联)的核心依据,例如“成绩表”通过“学号”(外键)关联“学生表”的主键“学号”。
常见的主键类型包括:
- 单一字段主键:如自增整数(ID)、身份证号、唯一编码等。
当表创建好以后但是没有主键的时候,可以再次追加主键
alter table 表名 add primary key(字段列表)
删除主键
alter table 表名 drop primary key;
- 复合主键:由多个字段组合而成,适用于单一字段无法唯一标识记录的场景(如“课程选课表”中,需“课程+成绩"组合作为主键)。
mysql> create table tt14( -> id int unsigned, -> course char(10) comment '课程代码', -> score tinyint unsigned default 60 comment '成绩', -> primary key(id, course) -- id和course为复合主键 -> );
mysql> insert into tt14 (id,course)values(1, '123'); Query OK, 1 row affected (0.02 sec) mysql> insert into tt14 (id,course)values(1, '123'); ERROR 1062 (23000): Duplicate entry '1-123' for key 'PRIMARY' -- 主键冲突