MySQL 表约束详解:非空、主键与外键的作用
表结构设计离不开约束。通过合理的约束机制,我们可以从技术层面倒逼数据录入的准确性,确保数据库中长期存储的数据是可信的。
一、非空约束 (NOT NULL)
字段值通常有两种状态:NULL(默认)和 NOT NULL(不为空)。虽然数据库允许字段默认为空,但在实际开发中,应尽可能避免关键字段为 NULL,因为空值往往无法参与正常的数值运算或逻辑判断。
这里需要区分 NULL 和空字符串 '':
NULL:表示'什么都没有',在数据库中是一个特殊的标记。'':表示'有值,但是内容为空'。

二、Default 约束
DEFAULT 类似于 C++ 中的缺省参数值。当插入数据时未指定该字段的值,系统会自动填充预设的默认值。

结合 NOT NULL 使用效果更佳:

注意: 如果表中既没有设置 DEFAULT 也没有设置 NOT NULL,默认行为是允许 NULL。一旦设置了 NOT NULL,则不再隐含 DEFAULT NULL 的行为。
三、Comment 列描述
列描述本质上就是注释,用于说明字段的用途,方便后续维护。

四、ZeroFill 约束
ZEROFILL 主要用于数字显示。单独使用 INT(10) 意义不大,但配合 ZEROFILL 后,不足位数的数字会用 0 补齐显示。

这相当于将 INT(10) 中的 10 定义为显示宽度,少于 10 位时自动补零。
五、主键约束 (PRIMARY KEY)
主键用于唯一标识表中的一行记录。它有两个核心特性:唯一性(不能重复)和非空性(不能为 NULL)。一张表中最多只能有一个主键,且通常由整数类型构成。

移除与添加主键:

复合主键: 主键不仅可以作用于单列,也可以作用于多列。当多列组合在一起作为主键时,只有这些列的值同时与已有数据完全一致,才会触发主键冲突。

六、Auto Increment 约束
自增字段 (AUTO_INCREMENT) 在插入数据时,若未指定值,系统会自动基于当前最大值 +1 生成新值。它常与主键搭配使用,作为逻辑主键。

自增长的关键特点:
- 任何字段要做自增长,前提是该字段本身必须是索引(Key 列有值)。
- 自增长字段必须是整数类型。
- 一张表最多只能有一个自增长字段。
自定义自增长起始值:

查看最后一次的自增值:

七、唯一键 (UNIQUE KEY)
主键不允许为空,而唯一键可以为 NULL。需要注意的是,NULL 不参与计算,因此唯一键允许多个 NULL 值存在。

区别点: 一张表中只能有一个主键,但可以拥有多个唯一键。
八、外键 (FOREIGN KEY)
外键主要用于定义表与表之间的关系,特别是主表和从表的关联。例如,学生属于某个班级,这种归属关系可以通过外键来约束。

因为学生是从属于某个班级的,所以需要在学生表中建立指向班级表的外键:

创建外键示例:

外键约束主要定义在从表上,主表必须包含主键或唯一键。定义外键后,要求从表的外键列数据必须在主表的主键列中存在,或者为 NULL。这保证了参照完整性,防止出现孤立的数据记录。


