MySQL 约束详解:非空、主键与外键的核心作用
表结构设计离不开约束(Constraint)。约束的本质是通过技术手段倒逼开发者插入正确的数据,从而保证数据库的准确性。在实际开发中,合理设置约束是保障数据完整性的最后一道防线。
一、非空约束 (NOT NULL)
字段默认允许为 NULL,但实际开发中我们更倾向于 NOT NULL。因为数据为空往往无法参与运算,且逻辑判断会变得复杂。
这里有个常见的误区:NULL 和 ''(空字符串)的区别。
- NULL:表示什么都没有,占位符,不参与计算。
- '':表示有值,只是内容为空。

二、默认值约束 (DEFAULT)
DEFAULT 约束类似于 C++ 中的默认参数。如果插入数据时未指定该字段,系统会自动填入默认值。
-- 示例:age 默认为 18
CREATE TABLE users (
id INT PRIMARY KEY,
age INT DEFAULT 18
);
注意一个细节:如果表中既没有设置 DEFAULT 也没有设置 NOT NULL,默认行为是 DEFAULT NULL。但如果设置了 NOT NULL,就不会再有 DEFAULT NULL 了。

三、列描述 (COMMENT)
给字段加注释,这跟代码里的注释一样重要,方便后续维护。

四、零填充约束 (ZEROFILL)
这个约束通常配合 INT 使用。比如 INT(10) 本身不显示前导零,加上 ZEROFILL 后,如果数字不足 10 位,会用 0 来补齐显示。

五、主键约束 (PRIMARY KEY)
主键是表的唯一标识。它有两个硬性要求:不能重复,不能为空。一张表中最多只能有一个主键,通常由整数类型构成。
移除与添加主键
-- 移除主键
ALTER TABLE table_name DROP PRIMARY KEY;
-- 添加主键
ALTER TABLE table_name ADD PRIMARY KEY (id);

复合主键
主键不只限于单列。当多列组合起来能唯一标识一行时,就是复合主键。只有当这几列同时与过往数据完全一致时,才会产生冲突。

六、自增约束 (AUTO_INCREMENT)
自增列通常作为逻辑主键使用。当字段未赋值时,系统会从当前最大值 +1 生成新值。
几个关键点:
- 自增字段必须是整数。
- 一张表最多只能有一个自增列。
- 做自增的前提是该字段本身必须包含索引。
-- 自定义起始值
ALTER TABLE table_name AUTO_INCREMENT = 100;
-- 查看当前自增值
SHOW TABLE STATUS LIKE 'table_name';

七、唯一键 (UNIQUE)
唯一键也要求数据不重复,但它可以接受 NULL 值。NULL 表示'无',不参与比较,所以多个 NULL 并不冲突。
一张表可以有多个唯一键,但只能有一个主键。

八、外键 (FOREIGN KEY)
外键用于定义表与表之间的关系,通常定义在从表上。主表必须有主键或唯一键。
举个例子,学生属于班级,那么学生表里就需要一个外键指向班级表的主键。这样能保证录入的学生所属班级是真实存在的。
-- 创建外键
ALTER TABLE student
ADD CONSTRAINT fk_class_id
FOREIGN KEY (class_id) REFERENCES class(id);

外键约束主要定义在从表上,当定义外键后,要求外键列数据必须在主表的主键列存在或为 NULL。设计时需谨慎,避免影响性能。

