mysql中的约束条件是对表中字段的取值规则进行限制的规则,能够有效避免无效数据、重复数据写入表,是数据库设计阶段需要重点考虑的内容。常见的约束条件包括主键约束、外键约束、唯一约束、非空约束、默认值约束和检查约束,不同约束的作用和定义方式存在差异。

常见约束条件类型及定义方式
1. 主键约束(PRIMARY KEY)
主键约束用于唯一标识表中的每一条记录,被约束的字段值不能重复也不能为NULL,一张表只能有一个主键,主键可以是一个字段也可以是多个字段的组合。
创建表时定义主键约束的语法如下:
-- 单字段主键
CREATE TABLE user (
id INT NOT NULL AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
PRIMARY KEY (id)
);
-- 复合主键
CREATE TABLE user_role (
user_id INT NOT NULL,
role_id INT NOT NULL,
PRIMARY KEY (user_id, role_id)
);
如果表已经创建完成,也可以通过修改表结构的方式添加主键约束:
ALTER TABLE user ADD PRIMARY KEY (id);
2. 外键约束(FOREIGN KEY)
外键约束用于建立两张表之间的关联关系,保证从表中外键字段的取值必须存在于主表的主键字段中,或者为NULL,以此维护数据的参照完整性。
创建表时定义外键约束的语法如下:
-- 主表:角色表
CREATE TABLE role (
id INT NOT NULL AUTO_INCREMENT,
role_name VARCHAR(50) NOT NULL,
PRIMARY KEY (id)
);
-- 从表:用户角色关联表,user_id关联user表的id,role_id关联role表的id
CREATE TABLE user_role (
id INT NOT NULL AUTO_INCREMENT,
user_id INT NOT NULL,
role_id INT NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (user_id) REFERENCES user(id),
FOREIGN KEY (role_id) REFERENCES role(id)
);
修改已有表添加外键约束的语法:
ALTER TABLE user_role ADD FOREIGN KEY (user_id) REFERENCES user(id);
3. 唯一约束(UNIQUE)
唯一约束保证被约束字段的所有取值都不重复,和主键约束的区别是唯一约束允许字段值为NULL,并且一张表可以有多个唯一约束。
创建表时定义唯一约束的语法:
CREATE TABLE user (
id INT NOT NULL AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
email VARCHAR(100),
PRIMARY KEY (id),
UNIQUE (username),
UNIQUE (email)
);
修改表添加唯一约束:
ALTER TABLE user ADD UNIQUE (email);
4. 非空约束(NOT NULL)
非空约束限制字段的值不能为NULL,插入或更新数据时如果没有给该字段赋值,会直接报错。
创建表时定义非空约束:
CREATE TABLE user (
id INT NOT NULL AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
age INT,
PRIMARY KEY (id)
);
修改表添加非空约束:
ALTER TABLE user MODIFY age INT NOT NULL;
5. 默认值约束(DEFAULT)
默认值约束在插入数据时如果没有给该字段赋值,会自动使用预设的默认值填充。
创建表时定义默认值约束:
CREATE TABLE user (
id INT NOT NULL AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
status TINYINT DEFAULT 1,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
);
修改表添加默认值约束:
ALTER TABLE user ALTER status SET DEFAULT 1;
6. 检查约束(CHECK)
检查约束用于限制字段的取值必须满足指定的条件,mysql 8.0.16及以上版本才完整支持检查约束。
创建表时定义检查约束:
CREATE TABLE user (
id INT NOT NULL AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
age INT,
PRIMARY KEY (id),
CHECK (age >= 0 AND age <= 120)
);
修改表添加检查约束:
ALTER TABLE user ADD CHECK (age >= 0 AND age <= 120);
约束条件的查看与删除
如果需要查看表中已有的约束条件,可以通过查看表结构的语句实现:
-- 查看表的所有约束信息 SHOW CREATE TABLE user;
删除约束的常用语法如下:
- 删除主键约束:
ALTER TABLE 表名 DROP PRIMARY KEY; - 删除外键约束:
ALTER TABLE 表名 DROP FOREIGN KEY 外键名; - 删除唯一约束:
ALTER TABLE 表名 DROP INDEX 唯一约束名; - 删除检查约束:
ALTER TABLE 表名 DROP CHECK 检查约束名; - 删除非空约束:
ALTER TABLE 表名 MODIFY 字段名 字段类型 NULL; - 删除默认值约束:
ALTER TABLE 表名 ALTER 字段名 DROP DEFAULT;
约束条件使用注意事项
在实际使用约束条件时需要注意以下几点:
- 外键约束会影响数据插入、更新、删除的性能,高并发场景下需要谨慎使用,也可以通过业务逻辑实现参照完整性。
- 复合主键的所有字段组合必须唯一,单个字段可以重复。
- 唯一约束的多个NULL值不算重复,符合SQL标准。
- 定义约束时如果指定了约束名,后续删除约束时可以直接使用约束名,否则需要使用系统自动生成的约束名。
mysql约束条件primary_keyforeign_keyunique修改时间:2026-07-05 09:21:31