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约束进行数据验证

 

约束是数据库设计的重要组成部分,合理使用约束可以大大减少数据异常和错误,提高数据质量。

点赞(1)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)