SQL 约束 CONSTRAINTS
- 默认模式
- 浅蓝色模式
- 淡绿色模式
- 深夜模式
SQL 约束
在上一章中,我们学习了如何使用CREATE TABLE语句创建数据表,并设置各个字段的数据类型。在创建数据表时,我们看到其添加了可以自增的主键字段id,这个自增的主键就是对数据表的一种重要约束条件。
约束是指对一个或多个表字段的限制条件,用于规定该字段中能够存储的数据值类型、范围或必须满足的特定条件。作为一种标准化的数据管理机制,约束有效确保了数据库表中数据的准确性、一致性和完整性。
在 SQL 中,有几种不同类型的约束,包括:NOT NULL、PRIMARY KEY、UNIQUE、DEFAULT、FOREIGN KEY 和CHECK。

NOT NULL 约束
NOT NULL 约束用于确保某个字段在插入或更新数据时,不能存储空值NULL。这意味着该字段必须始终包含有效的数据值,如果尝试向该字段插入或更新为NULL值,数据库将拒绝操作并返回错误,导致数据保存失败。
✅ 以下是使用 SQL 创建名为users的数据表,其中 id、username、phone 三列不接受NULL值:
CREATE TABLE users (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, -- MySQL 自增主键 字段不能为空
username VARCHAR(30) NOT NULL, -- 用户名字段 不能为空
birth_date DATE,
phone VARCHAR(15) NOT NULL UNIQUE -- 电话字段 不能为空且唯一
);
在创建表时,仅对必须包含有效数据的字段才应添加NOT NULL约束,非必要情况下不建议随意设置。
需要注意的是,空值NULL并不等同于零、空白字符或空字符串(零长度字符串),它表示该字段 “没有值” 或 “值未知”。
✅ 以下是 EMPTY STRING、NULL、0 和None之间的区别:
EMPTY STRING:默认值为一个确定的空白。插入时若省略,自动填入'',提供了安全的默认值,防止程序因漏传值而崩溃。NULL:表示该字段 "没有值" 或 "值未知"。插入时若省略,自动填入NULL。0:表示数值类型的零值。插入时若省略,自动填入0。None:不设置默认值。插入时若省略,行为由NULL约束决定(可能报错或为NULL)。
主键约束(PRIMARY KEY)
主键PRIMARY KEY约的具体功能就是确保其作用的列(或列组合)遵守以下两条不可违背的规则:
- 唯一性约束:禁止表中任何两行在该约束所定义的列上具有相同的值。
- 非空约束:禁止约束中的任何列接受
NULL值。
数据库管理系统会持续维护这个约束。任何违反这两条规则的INSERT或UPDATE操作都会被立即终止,并返回一个错误。
✅ 以下是使用 SQL 创建名为users的数据表,并将id列指定为主键:
CREATE TABLE users (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, -- MySQL 自增主键
username VARCHAR(30) NOT NULL,
birth_date DATE,
phone VARCHAR(15) NOT NULL UNIQUE
);
唯一约束(UNIQUE)
唯一约束用于保证指定列或列组合中的所有值都是唯一的,但允许存在NULL值(通常允许多个 NULL)。
UNIQUE 约束和PRIMARY KEY约束虽然都强制唯一性,但是PRIMARY KEY不允许为NULL值。
✅ 以下是使用 SQL 创建名为users的数据表,并将id列指定为主键:
CREATE TABLE users (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(30) NOT NULL,
birth_date DATE,
phone VARCHAR(15) NOT NULL UNIQUE, -- 唯一约束,不允许为空 NULL
email VARCHAR(50) UNIQUE -- 唯一约束,允许为空 NULL
);
值得注意的是,一个表中可以定义多个UNIQUE约束,而一个表上只能定义一个PRIMARY KEY约束。
默认约束(DEFAULT)
默认约束用于为数据表字段指定预设值。在插入新记录时,若未显式给该字段赋值,数据库将自动使用预设值进行填充。
设置默认约束的核心目的是什么?
- 简化插入操作:无需为每个可能有常见值的字段都手动输入数据。
- 保证数据完整性:确保即使没有提供值,该字段也不会是
NULL(除非默认值就是NULL),而是有一个合理的、有意义的初始值。 - 提供业务逻辑的默认行为:例如,订单的创建日期默认为当前时间,用户的状态默认为 “未激活” 等。
✅ 以下是使用 SQL 创建名为users的数据表,并为language和status列设定默认值:
CREATE TABLE users (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(30) NOT NULL,
birth_date DATE,
phone VARCHAR(15) NOT NULL UNIQUE,
language VARCHAR(10) DEFAULT 'en', -- 默认语言为英文 (en)
status TINYINT(1) DEFAULT 0 -- 默认状态为 0 (未激活)
);
外键约束(FOREIGN KEY)
外键(Foreign Key, FK)是一种数据库约束,定义为表中引用另一表主键的一个或多个列。其核心功能在于实施引用完整性,以强制维护表间数据的逻辑关系。
✅ 假设我们有两个表:用户表 (users) 和 订单表 (orders):
1. 用户表 (users) - 主表
| user_id (主键) | username | website_url | |
|---|---|---|---|
| 10918 | Alice | alice@kaicz.com | www.kaicz.com |
| 10919 | Bob | bob@kaicz.com | www.google.com |
| 10920 | Charlie | charlie@kaicz.com | www.alibaba.com |
2. 订单表 (orders) - 从表
| order_id (主键) | order_date | amount | user_id (外键) |
|---|---|---|---|
| 2025090100015 | 2025-09-01 | 99.99 | 10918 |
| 2025090200016 | 2025-09-02 | 50.00 | 10919 |
| 2025090300017 | 2025-09-03 | 25.50 | 10918 |
✅ 在 MySQL 中,您可以创建订单表 (orders) 表时,通过FOREIGN KEY外键约束来创建外键。SQL 语句如下:
-- 创建订单表 (从表),并添加外键约束
CREATE TABLE orders (
order_id BIGINT PRIMARY KEY,
order_date DATE NOT NULL,
amount DECIMAL(10, 2) NOT NULL,
user_id INT,
FOREIGN KEY (user_id) REFERENCES users(user_id) -- 外键约束,引用 users 表的 user_id 列
);
检查约束(CHECK)
CHECK 约束用于限制数据库表中某一列(或一组列)所能接受的数值范围。
例如,可以创建一个CHECK约束,将薪水(Salary)列的值限制在 3,000 至 10,000 的有效范围内,从而防止录入超出正常标准的工资数据。SQL 语句如下:
-- 创建订单表 (从表),并添加外键约束
CREATE TABLE orders (
order_id BIGINT PRIMARY KEY,
order_date DATE NOT NULL,
amount DECIMAL(10, 2) NOT NULL,
salary INT NOT NULL CHECK (salary >= 3000 AND salary <= 10000),
user_id INT,
FOREIGN KEY (user_id) REFERENCES users(user_id) -- 外键约束,引用 users 表的 user_id 列
);
反馈提交成功
感谢您的反馈,我们将尽快处理您的反馈