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替代方案:低版本可用触发器或应用层校验兜底
