目录

  1. SQL 约束简介
  2. SQL 约束的类型
  3. 创建约束的语法
  4. 约束的使用场景
  5. 约束的注意事项
  6. 参考资料

SQL 约束简介

SQL 约束(Constraints)用于定义数据库表中的规则,确保数据的完整性、准确性和一致性。它们限制了表中数据的类型、格式、大小等要求。通过使用约束,数据库管理系统可以有效地减少错误和不一致的数据插入,提高数据质量。

SQL 支持多种类型的约束,如主键约束、外键约束、唯一约束、非空约束等。约束可以在创建表时定义,也可以在表已经存在时通过 ALTER TABLE 语句添加。


SQL 约束的类型

PRIMARY KEY(主键约束)

主键约束用于确保表中每一行数据的唯一性。主键列的值必须是唯一的,并且不能为空。一个表只能有一个主键,且主键可以由一个或多个列组成。

CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    first_name VARCHAR(50),
    last_name VARCHAR(50)
);

在这个例子中,employee_id 是主键,确保每个员工都有一个唯一的 ID。

FOREIGN KEY(外键约束)

外键约束用于确保数据在多个表之间的引用完整性。外键列的值必须匹配另一个表的主键或唯一键。外键确保了数据的一致性,防止删除或更新被其他表引用的数据。

CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    department_id INT,
    FOREIGN KEY (department_id) REFERENCES departments(department_id)
);

在此示例中,department_id 是外键,引用 departments 表中的 department_id 列。

UNIQUE(唯一约束)

唯一约束用于确保列中的每个值都是唯一的,但与主键不同,唯一约束允许列包含空值。一个表中可以有多个唯一约束。

CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    email VARCHAR(100) UNIQUE
);

在这个例子中,email 列有一个唯一约束,确保每个员工的电子邮件地址都是唯一的。

NOT NULL(非空约束)

非空约束用于确保列中的每个值不能为空。它是数据库完整性的一种常见约束,防止插入空值到某些列中。

CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50)
);

在这个例子中,first_name 列不能为空。

CHECK(检查约束)

检查约束用于限制列中的值,确保它们符合特定的条件。它可以用于限制数值范围、字符串长度等。

CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    salary DECIMAL(10, 2),
    CHECK (salary > 0)
);

在此示例中,salary 列的值必须大于零。

DEFAULT(默认约束)

默认约束用于为列提供默认值。当插入数据时,如果没有为该列指定值,数据库会使用默认值。

CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    hire_date DATE DEFAULT CURRENT_DATE
);

在这个例子中,hire_date 列的默认值为当前日期,若插入数据时没有指定该列的值,数据库会自动填充为当前日期。


创建约束的语法

约束可以在创建表时定义,也可以在表创建后使用 ALTER TABLE 语句添加。以下是一些常见的语法:

在创建表时定义约束

CREATE TABLE table_name (
    column1 datatype constraint,
    column2 datatype constraint,
    ...

[table_constraint]

);

示例:创建带约束的表

CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50),
    hire_date DATE,
    salary DECIMAL(10, 2) CHECK (salary > 0),
    department_id INT,
    FOREIGN KEY (department_id) REFERENCES departments(department_id)
);

在已存在的表中添加约束

ALTER TABLE table_name
ADD CONSTRAINT constraint_name constraint_type;

例如,添加一个唯一约束:

ALTER TABLE employees
ADD CONSTRAINT unique_email UNIQUE (email);


约束的使用场景

  1. 数据完整性:约束确保表中的数据符合一定的规则,例如,主键确保唯一性,外键确保数据的一致性和关联性。
  2. 防止无效数据:使用 NOT NULLCHECK 约束,可以防止插入无效或不合格的数据(如空值或负值)。
  3. 提高数据质量:约束如 UNIQUEPRIMARY KEY 可以防止重复数据的插入,确保数据的质量。
  4. 数据库关系:外键约束用于创建数据库中的表之间的关系,确保数据的关联性,防止孤立的记录。

约束的注意事项

  1. 性能问题
    • 使用约束(特别是外键约束)时,可能会对性能产生影响。特别是在大表上进行插入、更新和删除时,约束的检查会增加额外的负担。
  2. 删除与更新行为
    • 外键约束通常需要定义删除和更新行为。常见的选项包括 ON DELETE CASCADE(级联删除)和 ON UPDATE CASCADE(级联更新)。如果没有定义,某些数据库会阻止删除或更新被外键引用的数据。
  3. 不能修改已存在的约束
    • 在某些情况下,修改已存在的约束(如修改主键或外键)可能是不可行的。通常需要删除旧的约束并创建新的约束。
  4. 约束的顺序
    • 在创建表时,建议根据约束的依赖关系来排列约束,避免外键约束依赖的表还没有创建的情况。

参考资料