主键约束确保每行唯一且非空,一个表仅能有一个主键,可由单或多字段组成,自动创建唯一索引;2. 外键约束维护表间引用完整性,外键值必须存在于被引用表的主键或唯一键中,支持级联操作;3. 唯一约束保证字段或字段组合值唯一,允许NULL值;4. 非空约束强制字段不得插入NULL,适用于必填数据;5. 默认值约束在未指定字段值时自动填充默认值,支持常量或表达式;6. 检查约束限制字段取值范围,mysql 8.0.16起才真正生效。
MySQL 中的约束是用来保证数据完整性和一致性的规则。通过在表上定义约束,可以限制字段的数据输入,防止无效或错误的数据被插入或更新。以下是 MySQL 常见的约束种类及其作用和使用方式的总结。
1. 主键约束(PRIMARY KEY)
作用:唯一标识表中的每一行记录,不允许重复,也不允许为 NULL。
特点:
- 一个表只能有一个主键。
- 可以由单个字段或多个字段组成(复合主键)。
- 自动创建唯一索引,提高查询效率。
示例:
CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) );
2. 外键约束(FOREIGN KEY)
作用:维护表与表之间的引用完整性,确保一个表中的字段值必须在另一个表的主键或唯一键中存在。
特点:
示例:
CREATE TABLE orders ( order_id INT PRIMARY KEY, user_id INT, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE );
3. 唯一约束(UNIQUE)
作用:确保某列或多列组合的值在表中是唯一的,但允许有 NULL 值(NULL 可出现多次)。
注意:主键也具有唯一性,但唯一约束可以用于非主键字段。
示例:
4. 非空约束(NOT NULL)
作用:限制字段不能插入 NULL 值,必须提供有效数据。
应用场景:常用于必填字段,如用户名、注册时间等。
示例:
CREATE TABLE products ( name VARCHAR(100) NOT NULL, price DECIMAL(10,2) );
5. 默认值约束(default)
作用:当插入数据时未指定该字段的值,系统会自动使用默认值填充。
支持类型:字符串、数字、表达式(如 CURRENT_TIMESTAMP)。
示例:
CREATE TABLE logs ( log_time DATETIME DEFAULT CURRENT_TIMESTAMP, status VARCHAR(20) DEFAULT 'pending' );
6. 检查约束(CHECK)
作用:限制字段的取值范围,确保满足指定条件。
注意:MySQL 8.0.16 以上版本才真正支持 CHECK 约束并强制执行。
示例:
CREATE TABLE students ( age INT CHECK (age >= 0 AND age <= 150), gender VARCHAR(10) CHECK (gender IN ('M', 'F')) );
基本上就这些。合理使用这些约束能有效提升数据库的稳定性和数据质量。虽然部分老版本对某些约束(如 CHECK)支持较弱,但在设计阶段仍建议明确写出,便于维护和迁移。不复杂但容易忽略的是外键的级联行为和唯一约束对 NULL 的处理,需要特别留意实际业务需求。