MySQL 约束详解:非空、主键与外键的核心作用
数据库表中的约束(Constraint)就像是数据的'红绿灯',通过技术手段倒逼程序员插入正确的数据,从而保证数据库中数据的准确性。在实际开发中,合理设计约束是保障数据质量的第一道防线。
一、非空约束 (NOT NULL)
字段值通常有两种状态:NULL(默认,表示什么都没有)和 NOT NULL(不为空)。虽然数据库默认允许字段为空,但在实际业务中,我们应尽可能保证关键字段不为空,因为空值往往无法参与正常的运算逻辑。
这里需要区分 NULL 和空字符串 '':
NULL:表示没有值,占位符。'':有值,但是内容为空。
-- 创建表时指定非空
CREATE TABLE users (
id INT NOT NULL,
username VARCHAR(50) NOT NULL
);
二、默认值约束 (DEFAULT)
DEFAULT 类似于 C++ 中的缺省值。如果插入数据时未指定该字段的值,系统会自动填入默认值。
注意: 如果表中既没有设置 DEFAULT 也没有设置 NOT NULL,默认行为是 DEFAULT NULL。一旦设置了 NOT NULL,则不再隐含 DEFAULT NULL。
-- 设置默认值
CREATE TABLE orders (
status TINYINT DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
三、列描述 (COMMENT)
列描述本质上就是注释,用于说明该字段的具体含义,方便后续维护。
COMMENT '用户唯一标识' ON COLUMN id;
四、零填充约束 (ZEROFILL)
ZEROFILL 通常配合 INT 类型使用。它规定了显示宽度,如果实际数字长度不足,会用 0 来补充显示。
例如 INT(10) 加上 ZEROFILL,输入 5 会显示为 0000000005。这在某些特定展示场景下有用,但需注意这实际上会将字段转为无符号整数。
五、主键约束 (PRIMARY KEY)
主键是表中最重要的约束,用于唯一标识每一行记录。它有两个核心特性:
- 唯一性:不能重复。


