MySQL 约束是确保数据库中数据完整性和有效性的重要机制。您已经很好地总结了 MySQL 支持的 6 种主要约束,下面我将进一步补充和扩展这些约束的相关知识:
1. 主键约束 (PRIMARY KEY)
每个表只能有一个主键
主键列不能包含 NULL 值
主键可以由单个列或多个列组合构成(复合主键)
自动创建聚集索引
CREATE TABLE students ( student_id INT PRIMARY KEY, name VARCHAR(50) );
复合主键示例
CREATE TABLE order_items ( order_id INT, product_id INT, quantity INT, PRIMARY KEY (order_id, product_id) );
2. 外键约束 (FOREIGN KEY)
维护表之间的引用完整性
可以设置级联操作(ON DELETE/UPDATE CASCADE/SET NULL等)
引用表和被引用表必须使用相同的存储引擎
CREATE TABLE orders ( order_id INT PRIMARY KEY, customer_id INT, FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON DELETE CASCADE );
3. 唯一约束 (UNIQUE)
允许NULL值,但只能有一个NULL(因为NULL不等于NULL)
一个表可以有多个唯一约束
自动创建非聚集索引
CREATE TABLE users ( user_id INT PRIMARY KEY, email VARCHAR(100) UNIQUE, username VARCHAR(50) UNIQUE );
4. 检查约束 (CHECK) (MySQL 8.0.16+)
早期MySQL版本会解析但不强制执行CHECK约束
可以定义复杂的验证逻辑
CREATE TABLE employees ( emp_id INT PRIMARY KEY, salary DECIMAL(10,2) CHECK (salary > 0), age INT CHECK (age >= 18 AND age <= 65) );
5. 非空约束 (NOT NULL)
强制列不接受NULL值
与DEFAULT约束结合使用效果更好
CREATE TABLE products ( product_id INT PRIMARY KEY, product_name VARCHAR(100) NOT NULL, price DECIMAL(10,2) NOT NULL );
6. 默认值约束 (DEFAULT)
当插入数据未指定值时使用默认值
默认值可以是常量、表达式或函数(如CURRENT_TIMESTAMP)
CREATE TABLE orders ( order_id INT PRIMARY KEY, order_date DATETIME DEFAULT CURRENT_TIMESTAMP, status VARCHAR(20) DEFAULT 'pending' );
约束管理操作
添加约束(已存在表)
ALTER TABLE students ADD PRIMARY KEY (student_id); ALTER TABLE students ADD CONSTRAINT uk_email UNIQUE (email); ALTER TABLE employees ADD CONSTRAINT chk_age CHECK (age >= 18);
删除约束
ALTER TABLE students DROP PRIMARY KEY; ALTER TABLE students DROP CONSTRAINT uk_email;
修改约束
通常需要先删除旧约束再添加新约束
约束的最佳实践
1. 为每个表定义主键
2. 合理使用外键维护数据完整性
3. 对经常查询的列添加适当的唯一约束
4. 为必填字段设置NOT NULL约束
5. 为常用字段设置合理的默认值
6. 在MySQL 8.0.16+中使用CHECK约束进行数据验证
约束是数据库设计的重要组成部分,合理使用约束可以大大减少数据异常和错误,提高数据质量。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程