数据库-约束(CONSTRAINT)
摘要:数据库约束是用于限制表中数据类型的规则,主要包括主键、外键、唯一、非空、检查和默认值约束。约束可在创建表时定义(列级或表级),也可后期通过ALTERTABLE添加。最佳实践包括显式命名约束(如pk_、fk_前缀)和遵循命名规范。约束管理使用ADD/DROP等关键字,外键还支持级联操作(ONDELETE CASCADE等)。建议始终显式命名约束以便维护,并可通过ALTERTABLE语句灵活修改
约束是应用于表列上的规则,用于限制表中数据的类型。
一、约束类型
下表列出了数据库中最常见的约束类型及其作用:
|
约束类型 |
关键字 |
作用 |
|
主键约束 |
PRIMARY KEY |
唯一标识每行,确保唯一且非空 |
|
外键约束 |
FOREIGN KEY |
确保数据必须存在于另一个表中,维护引用完整性 |
|
唯一约束 |
UNIQUE |
确保某列中的所有值都是不同的 |
|
非空约束 |
NOT NULL |
强制该列必须有值,不能为 NULL |
|
检查约束 |
CHECK |
确保列中的值满足一个指定的条件 |
|
默认值约束 |
DEFAULT |
当未指定值时,自动提供一个默认值 |
二、创建约束
创建约束主要有两种方式:在创建表时定义 和 为已存在的表添加。
方法1:创建表时定义约束
这是在建表语句中直接定义约束,可以使用列级约束或表级约束。
语法示例:
CREATE TABLE table_name (
-- 列级约束
column1 datatype [CONSTRAINT constraint_name] constraint_type,
column2 datatype,
...
-- 表级约束(用于主键、外键、复合约束等)
[CONSTRAINT constraint_name] constraint_type (column_list)
);
说明:
- 约束可以在列级约束(跟在列定义后)或表级约束(单独定义)定义。
- CONSTRAINT constraint_name(显式命名约束) 是可选的,但强烈建议使用。
注意: 一个字段可以定义多个约束类型!
column_name data_type [constraint1] [constraint2] [constraint3] ...
具体示例:
CREATE TABLE Employees (
-- 列级约束
emp_id NUMBER CONSTRAINT pk_employees PRIMARY KEY,
emp_name VARCHAR2(50) NOT NULL, -- 非空约束(无名)
email VARCHAR2(100) CONSTRAINT uk_email UNIQUE,
age NUMBER CONSTRAINT chk_age CHECK (age >= 18),
dept_id NUMBER NOT NULL,
hire_date DATE NOT NULL DEFAULT CURRENT_DATE,
-- 表级约束
CONSTRAINT fk_emp_dept
FOREIGN KEY (dept_id)
REFERENCES Departments(dept_id)
ON DELETE SET NULL
);
方法2:为已存在的表添加约束
使用 ALTER TABLE 语句为已经创建的表添加约束。
通用语法:
ALTER TABLE table_name
ADD [CONSTRAINT constraint_name] constraint_type (column_list);
各类型约束的添加示例:
-- 添加主键
ALTER TABLE Employees ADD CONSTRAINT pk_employees PRIMARY KEY (emp_id);
-- 添加外键
ALTER TABLE Employees ADD CONSTRAINT fk_emp_dept FOREIGN KEY (dept_id) REFERENCES Departments(dept_id);
-- 添加唯一约束
ALTER TABLE Employees ADD CONSTRAINT uk_employee_email UNIQUE (email);
-- 添加检查约束
ALTER TABLE Employees ADD CONSTRAINT chk_employee_age CHECK (age >= 18);
-- 添加非空约束,注意:非空约束的语法略有不同
ALTER TABLE Employees MODIFY emp_name NOT NULL;
三、创建约束的最佳实践
1. 始终显式命名约束
强烈建议为所有约束显式命名,而不是依赖系统自动生成的名字。这使得后续的管理、修改和错误排查变得非常容易。
-- 推荐:显式命名
ALTER TABLE employees ADD CONSTRAINT pk_employees PRIMARY KEY (emp_id);
-- 不推荐:系统自动生成名称(如SYS_C0012345)
ALTER TABLE employees ADD PRIMARY KEY (emp_id);
2.推荐的约束命名规范
|
约束类型 |
命名前缀 |
示例 |
说明 |
|
主键约束 |
pk_ |
pk_employees |
Primary Key |
|
外键约束 |
fk_ |
fk_employees_department |
Foreign Key,包含父子表名 |
|
唯一约束 |
uk_ |
uk_employee_email |
Unique Key |
|
检查约束 |
chk_ |
chk_employee_age |
Check Constraint |
|
非空约束 |
nn_ |
nn_employee_name |
Not Null(某些数据库支持命名) |
四、删除约束
删除约束使用 ALTER TABLE...DROP CONSTRAINT 语句。
基本语法
ALTER TABLE table_name DROP CONSTRAINT constraint_name;
具体示例
-- 删除主键约束,如果有约束名
ALTER TABLE Employees DROP CONSTRAINT pk_employees;
-- 删除主键约束,如果不知道约束名(不推荐)
ALTER TABLE Employees DROP PRIMARY KEY;
-- 删除外键约束
ALTER TABLE Employees DROP CONSTRAINT fk_emp_dept;
-- 删除检查约束
ALTER TABLE Employees DROP CONSTRAINT chk_employee_age;
-- 删除唯一约束
ALTER TABLE Employees DROP CONSTRAINT uk_employee_email;
-- 删除非空约束,实际上是将列修改为允许NULL
ALTER TABLE Employees MODIFY emp_name NULL;
五、约束关键字
除了约束类型本身的关键字(如 PRIMARY KEY, FOREIGN KEY),还有一些与之紧密配合、共同管理约束行为的关键字。以下是这些关键字的详细说明:
1.CONSTRAINT- 约束定义符
这是最重要的相关关键字,用于显式命名一个约束。
- 作用:为约束赋予一个唯一的、有意义的名称,便于后续管理和识别。
- 为什么重要:当违反约束时,数据库会显示你设置的名称,而不是系统自动生成的(如 SYS_C0012345),这使得调试和维护变得非常容易。
语法示例:
-- 使用 CONSTRAINT 关键字显式命名主键约束
CONSTRAINT pk_employees PRIMARY KEY (emp_id)
2.REFERENCES- 外键引用符
此关键字专门用于外键约束,指明要引用的父表和列。
- 作用:定义外键关系中的“被引用方”。
- 必须与 FOREIGN KEY 配对使用(或在列级约束中单独使用)。
语法示例:
-- 列级约束
dept_id INT REFERENCES Departments(dept_id)
-- 表级约束
CONSTRAINT fk_emp_dept FOREIGN KEY (dept_id) REFERENCES Departments(dept_id)
3. 级联操作关键字 (ON DELETE/ON UPDATE)
这些关键字定义了当父表中的记录被删除或更新时,子表中的对应记录应如何操作。它们专门用于外键约束。
|
关键字组合 |
作用 |
|
ON DELETE CASCADE |
级联删除。删除父表记录时,自动删除所有关联的子表记录。 |
|
ON DELETE SET NULL |
置为空。删除父表记录时,将子表中对应外键字段设为 NULL。 |
|
ON DELETE SET DEFAULT |
置为默认值。删除父表记录时,将子表中对应外键字段设为其默认值。 |
|
ON DELETE NO ACTION / RESTRICT |
无操作/限制。(默认)阻止删除被引用的父表记录。 |
|
ON UPDATE |
同理,定义父表更新时的级联操作(如 ON UPDATE CASCADE)。 |
完整示例:
CREATE TABLE Orders (
order_id INT PRIMARY KEY,
customer_id INT,
CONSTRAINT fk_orders_customers
FOREIGN KEY (customer_id)
REFERENCES Customers(customer_id)
ON DELETE CASCADE -- 客户被删除,其所有订单也被自动删除
);
4. 约束管理关键字 (ALTER TABLE/DROP)
这些关键字用于在表创建之后修改或删除约束。
|
关键字 |
作用 |
示例 |
|
ADD |
为已存在的表添加约束。 |
ALTER TABLE Employees ADD CONSTRAINT ... |
|
DROP |
删除一个已存在的约束。 |
ALTER TABLE Employees DROP CONSTRAINT pk_employees; |
|
DISABLE / ENABLE |
禁用/启用约束。(非所有数据库支持,如Oracle) |
ALTER TABLE Employees DISABLE CONSTRAINT chk_salary; |
|
NOVALIDATE |
(非所有数据库支持)使约束仅对新数据生效,不验证已有数据。 |
ALTER TABLE Employees ADD CONSTRAINT ... NOVALIDATE; |
管理示例:
-- 添加约束
ALTER TABLE Employees
ADD CONSTRAINT uk_employee_email UNIQUE (email);
-- 删除约束
ALTER TABLE Employees
DROP CONSTRAINT uk_employee_email;
-- 禁用约束 (例如在Oracle中)
ALTER TABLE Employees DISABLE CONSTRAINT fk_emp_dept;
更多推荐



所有评论(0)