约束概述
约束在数据库层面确保数据符合预设规则,不合规的数据无法写入。
没有约束的表就像一个没有门禁的小区,什么人都能进:员工年龄写成负数、邮箱重复没人管、部门代码指向一个不存在的部门。这些"脏数据"一旦混进来,后续的统计、关联查询、业务逻辑全都会出乱子。约束的作用,就是在数据入库之前做好最后一道把关。
SQL 提供了六种标准约束:
| 约束 | 一句话作用 |
|---|---|
NOT NULL | 这列不能空着 |
UNIQUE | 这列的值全表不能重复 |
PRIMARY KEY | 唯一标识每一行,NOT NULL + UNIQUE |
FOREIGN KEY | 这列的值必须来自另一张表 |
CHECK | 这列的值必须满足某个条件 |
DEFAULT | 没填值时自动用默认值 |
约束可以在建表时定义(列级或表级),也可以通过 ALTER TABLE 后续补上。列级约束直接跟在列定义后面,简单直观;表级约束可以给约束命名,方便后续管理,也支持多列组合约束。
标准写法:
-- 建表时混合使用列级和表级约束
CREATE TABLE 表名 (
列名1 数据类型 NOT NULL PRIMARY KEY,
列名2 数据类型 UNIQUE,
列名3 数据类型 DEFAULT 默认值,
CONSTRAINT 约束名 FOREIGN KEY (列名) REFERENCES 父表(主键)
);
以飞翔科技为例。一个设计良好的员工表,各种约束各司其职:
CREATE TABLE employees (
emp_id INT NOT NULL PRIMARY KEY,
emp_name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
dept_code TINYINT DEFAULT 1,
basic_salary DECIMAL(10,2) NOT NULL CHECK (basic_salary > 0),
company_name VARCHAR(100) DEFAULT '广州飞翔科技',
CONSTRAINT fk_dept FOREIGN KEY (dept_code) REFERENCES departments(dept_id)
);
这短短几行把六种约束全用上了:emp_id 是主键、emp_name 不能为空、email 不能重复、dept_code 默认给 1、basic_salary 必须大于 0、company_name 自动填公司名、外键确保部门是真实存在的。数据入库前就要经历所有这些检查,质量从源头就有保障。接下来几篇,我们逐一拆解每种约束的细节。