MySQL 约束详解:非空、主键、外键与自增机制实战
表结构设计阶段,约束是保证数据准确性的核心手段。通过技术手段倒逼写入逻辑,确保入库数据的完整性。下面结合实战场景,梳理几种常用约束的本质区别与使用规范。
非空约束与空值语义
字段默认允许为 NULL,但实际开发中应尽量避免。因为 NULL 无法参与数值运算,且统计函数处理逻辑特殊。这里需要区分 NULL 和空字符串 '':
NULL:表示'没有值',即缺失。'':表示'有值',只是内容为空。

默认值与列描述
DEFAULT 类似于 C++ 中的缺省参数,当插入数据未指定该字段时生效。若同时设置 NOT NULL 和 DEFAULT,则必须提供默认值。

注意:若未显式设置 DEFAULT,系统默认为 NULL;一旦设定 NOT NULL,则不再隐含 DEFAULT NULL。此外,利用 COMMENT 添加列描述能显著提升后续维护效率,这等同于在代码层面增加注释。
零填充约束
ZEROFILL 仅对整数类型有意义。它会在显示不足指定位数时自动补零。例如 INT(10) 配合 ZEROFILL,输入 5 会显示为 0000000005。

主键约束
主键(Primary Key)用于唯一标识记录,具备不可重复、不可为空的特点。一张表只能有一个主键,通常由整数类型的列构成。

复合主键:支持多列联合作为主键。只有当所有主键列的值同时与现有数据相同时,才会触发冲突。

自增长约束
AUTO_INCREMENT 常用于主键列,实现逻辑上的唯一递增。其核心规则如下:
- 必须是整数类型。
- 必须建立索引。
- 单表最多一个自增列。
当不指定值时,系统取当前最大值加 1。自定义起始值可通过修改表属性实现。

查看最后插入的自增值:
SELECT LAST_INSERT_ID();
唯一键约束
唯一键(Unique Key)与主键类似,但允许存在 NULL 值(NULL 不参与计算)。一张表可拥有多个唯一键,适合用于邮箱、手机号等需去重但不作为主键的场景。

外键约束
外键定义了表与表之间的引用关系,通常位于从表(子表),指向主表的主键或唯一键。
创建外键时需注意级联操作策略。如果主表数据被删除,从表受影响的行如何处理,取决于定义时的 ON DELETE 选项。

建表示例:
CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT,
class_id INT,
FOREIGN KEY (class_id) REFERENCES classes(id)
);
约束设计直接影响业务逻辑的健壮性。理解每种约束的底层行为,能帮助我们在建模阶段规避大部分数据异常风险。

