约束是应用于表列上的规则,用于限制表中数据的类型。

一、约束类型

下表列出了数据库中最常见的约束类型及其作用:

约束类型

关键字

作用

主键约束

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;

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐