MySQL 表约束详解:从基础到实战
在数据库设计中,数据类型只是第一道防线。真正保证数据质量、防止脏数据入库的,是表的约束(Constraints)。它们像一套隐形的规则,强制程序写入符合预期的数据。
为什么需要表约束?
单纯依靠数据类型(如 INT, VARCHAR)有时是不够的。比如 INT 能限制范围,但无法阻止你插入逻辑上错误的值(如年龄为负数)。约束机制就是为了解决这类问题,通过技术手段倒逼开发者输入正确数据。站在数据库的角度,凡是成功存入的数据,都必须满足所有定义的约束条件。
常见约束类型
非空约束 (NOT NULL)
默认情况下,字段允许为 NULL。如果业务要求某项信息必须存在(例如用户名),就需要设置 NOT NULL。
CREATE TABLE users (
id INT,
name VARCHAR(50) NOT NULL
);
执行 DESC users 可以看到 Null 列显示为 NO。尝试插入 NULL 值时,MySQL 会直接拦截并报错。
默认值 (DEFAULT)
当某个字段经常使用固定值时,可以设置默认值。这类似于函数参数中的缺省值,不传参时使用预设值。
CREATE TABLE orders (
id INT,
status VARCHAR(20) DEFAULT 'pending'
);
插入数据时若未指定 status,系统会自动填入 'pending'。
注意:
NOT NULL和DEFAULT并不冲突,而是互补。NOT NULL禁止显式传入空值,而DEFAULT在不传值时提供兜底。两者常结合使用:column_type NOT NULL DEFAULT value。
列描述 (COMMENT)
用于记录字段的业务含义,方便后续维护。它不会改变数据行为,仅作为元数据保存。
CREATE TABLE products (
price DECIMAL(10,2) COMMENT '商品单价'
);
查看描述需使用 SHOW CREATE TABLE,DESC 命令通常不显示注释内容。
零填充 (ZEROFILL)
主要用于整数显示格式。开启后,不足宽度的数字会在左侧自动补零。
CREATE TABLE numbers (
a INT ZEROFILL(10)
);
插入 123 后,查询结果显示为 0000000123。注意:这只是显示效果,底层存储依然是 123。此外,ZEROFILL 隐含了 UNSIGNED 属性。
主键 (PRIMARY KEY)
主键是唯一标识一行记录的字段,具有唯一性且不能为空。一张表只能有一个主键。
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(50)
);
若表已创建,可使用 ALTER TABLE 添加或删除主键:
ALTER TABLE students ADD PRIMARY KEY (id);
ALTER TABLE students DROP PRIMARY KEY;
复合主键
当单个字段无法唯一标识记录时,可将多个字段组合成主键。只有组合完全重复时才会触发约束。
CREATE TABLE enrollments (
student_id INT,
course_id INT,
PRIMARY KEY (student_id, course_id)
);
自增长 (AUTO_INCREMENT)
常用于主键,自动分配递增的唯一整数。通常与主键配合使用。
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
msg VARCHAR(255)
);
特性:
- 必须是索引列。
- 必须是整数类型。
- 单表最多一个自增列。
手动插入过 ID 后,自增计数器会从当前最大值 +1 开始,可通过 SHOW CREATE TABLE 查看 AUTO_INCREMENT 值。
唯一键 (UNIQUE KEY)
保证字段值不重复,但允许为空(空值之间互不影响唯一性)。适合邮箱、手机号等场景。
CREATE TABLE accounts (
email VARCHAR(100) UNIQUE
);
外键 (FOREIGN KEY)
用于维护表与表之间的关联关系。外键列的值必须在主表的主键或唯一键中存在,或者为 NULL。
-- 主表
CREATE TABLE classes (
id INT PRIMARY KEY,
name VARCHAR(50)
);
-- 从表
CREATE TABLE students (
id INT PRIMARY KEY,
class_id INT,
FOREIGN KEY (class_id) REFERENCES classes(id)
);
外键约束是双向的:既防止从表引用不存在的主表数据,也防止主表删除被从表引用的数据(除非级联操作)。这是保证数据一致性的关键机制。
掌握这些约束,能让你的数据库设计更加健壮,减少后期维护成本。在实际开发中,根据业务需求合理组合使用,是构建高质量数据模型的基础。


