mysql约束是保障数据质量的核心机制,包括主键(唯一非空,自动索引)、外键(维护表间引用完整性)、非空与唯一(分别限制NULL和重复值)、默认值(自动填充)及检查约束(8.0.16+强制校验)。

MySQL 中的约束是保障数据质量的核心机制,直接作用于表字段或整张表,用来强制执行业务规则、防止脏数据入库。常见的约束类型有六种,各自用途明确,搭配使用能大幅提升数据可靠性。
主键约束(PRIMARY KEY)
主键是一行记录的唯一标识,要求该字段值非空且唯一。一张表只能有一个主键,但可以由单个字段(如 id)或多个字段联合构成(复合主键)。主键会自动创建索引,提升查询效率。
- 创建时定义:
id int PRIMARY KEY或PRIMARY KEY(id) - 支持自增:
id INT PRIMARY KEY AUTO_INCREMENT,常用于逻辑主键 - 复合主键示例:
PRIMARY KEY(user_id, order_date),表示组合值不能重复
外键约束(FOREIGN KEY)
外键用于建立两张表之间的关联关系,确保从表中某字段的值必须存在于主表对应字段(通常是主键)中,从而维护引用完整性。使用前需确保主表已存在,且字段类型、字符集完全一致。
- 建表时添加:
FOREIGN KEY (user_id) REFERENCES users(id) - 注意:InnoDB 引擎支持外键,MyISAM 不支持
- 外键字段可为空,但若非空,则值必须在主表中存在
非空约束(NOT NULL)与唯一约束(UNIQUE)
非空约束强制字段不允许插入 NULL 值;唯一约束则保证字段值在整个表中不重复(但允许一个或多个 NULL——因为 NULL ≠ NULL)。
- 两者可单独使用,也可组合:
username VARCHAR(32) NOT NULL UNIQUE - 唯一约束也会自动创建索引,适合做高频查询条件(如邮箱、手机号)
- 一个表可有多个唯一约束,不限于主键
默认约束(default)与检查约束(CHECK)
DEFAULT 为字段设定默认值,插入时未显式提供该列值即自动填充;CHECK 用于校验字段值是否满足指定表达式(如 age >= 0),但注意:MySQL 5.7 及更早版本解析 CHECK 语法但不生效,8.0.16+ 才真正支持并强制执行。
- 默认值写法:
status TINYINT DEFAULT 1,支持常量、函数(如CURRENT_TIMESTAMP) - CHECK 示例:
CHECK (price > 0 AND price - 替代方案:低版本可用触发器或应用层校验兜底