SQL 约束

在本教程中,你将学习如何使用 SQL 约束。

什么是约束?

约束只是对表的一列或多列的限制,以限制可以存储在该列中的值的类型。约束提供了一种标准机制来维护表中数据的准确性和完整性。

SQL 中有几种不同类型的约束,包括:

  • NOT NULL
  • PRIMARY KEY
  • UNIQUE
  • DEFAULT
  • FOREIGN KEY
  • CHECK

现在,让我们详细讨论这些约束中的每一个。

NOT NULL 约束

NOT NULL 限制规定列不接受 NULL 值。

这意味着如果 NOT NULL 对列应用约束,则无法在不为该列添加非 NULL 值的情况下在表中插入新行。

以下 SQL 语句创建一个名为 *persons 的*表,其中包含四列,其中三列,*id*,namephone 不接受 NULL 值。

CREATE TABLE persons (
    id INT NOT NULL,
    name VARCHAR(30) NOT NULL,
    birth_date DATE,
    phone VARCHAR(15) NOT NULL
);

注意: 空值或 NULL 不等于零(0),空白或零长度字符串,如 ''NULL 表示没有输入。

主键约束

PRIMARY KEY 约束识别具有唯一地标识一个表中的行的值列的列或组。表中没有两行可以具有相同的主键值。此外,你不能在主键列中输入 NULL 值。

以下 SQL 语句创建名为 persons 的表,并将 id 列指定为主键。这意味着此字段不允许 NULL 或重复值。

CREATE TABLE persons (
    id INT NOT NULL PRIMARY KEY,
    name VARCHAR(30) NOT NULL,
    birth_date DATE,
    phone VARCHAR(15) NOT NULL
);

提示: 主键通常由表中的一列组成,但是多个列可以包含主键,例如,员工的电子邮件地址或分配的标识号是员工表的逻辑主键。

UNIQUE 约束

UNIQUE 约束限制一个或多个列在表中包含唯一值。

尽管 UNIQUE 约束和 PRIMARY KEY 约束都强制实施唯一性,但如果要强制实施不是主键的列或列组合的唯一性,请使用 UNIQUE 约束而不是 PRIMARY KEY 约束。

以下 SQL 语句创建名为 persons 的表,并将 phone 列指定为唯一。这意味着此字段不允许重复值。

CREATE TABLE persons (
    id INT NOT NULL PRIMARY KEY,
    name VARCHAR(30) NOT NULL,
    birth_date DATE,
    phone VARCHAR(15) NOT NULL UNIQUE
);

注意: UNIQUE 可以在表上定义多个约束,而在表上只能定义一个 PRIMARY KEY 约束。此外,与 PRIMARY KEY 约束不同, UNIQUE 约束允许 NULL 值。

DEFAULT 约束

DEFAULT 约束指定列的默认值。

列默认值是当 INSERT 语句未显式指定特定值时,数据库引擎将在列中插入的某个值。

以下 SQL 语句为 country 列创建默认值。

CREATE TABLE persons (
    id INT NOT NULL PRIMARY KEY,
    name VARCHAR(30) NOT NULL,
    birth_date DATE,
    phone VARCHAR(15) NOT NULL UNIQUE,
    country VARCHAR(30) NOT NULL DEFAULT 'Australia'
);

注意: 如果将表列定义为 NOT NULL ,但为列指定了默认值,则在 INSERT 语句中不需要为该列显式指定值,以便在表中插入新行。

外键约束

外键(FK)是列或列的组合,用于建立和强制两个表中的数据之间的关系。

这是一个示例图,显示了 employeesdepartments 表之间的关系。如果仔细查看,你会注意到 employees 表的 dept_id 列与 departments 表的主键列匹配。因此,employees 表的 dept_id 列是 departments 表的外键。

外键关系图

在 MySQL 中,你可以通过 FOREIGN KEY 在创建表时定义约束来创建外键,如下所示。以下语句在 employees 表的 dept_id 列上建立一个外键,该列引用 departments 表的 dept_id 列。

CREATE TABLE employees (
    emp_id INT NOT NULL PRIMARY KEY,
    emp_name VARCHAR(55) NOT NULL,
    hire_date DATE NOT NULL,
    salary INT,
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

CHECK 约束

CHECK 约束是用来限制可被放置在一个列中的值。

例如,可以通过创建 CHECK 允许值仅为 3,000 到 10,000 的约束来限制工资列的值范围。这可以防止工资超出正常工资范围。这是一个例子:

CREATE TABLE employees (
    emp_id INT NOT NULL PRIMARY KEY,
    emp_name VARCHAR(55) NOT NULL,
    hire_date DATE NOT NULL,
    salary INT NOT NULL CHECK (salary >= 3000 AND salary <= 10000),
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

注意: MySQL 不支持 SQL 检查约束。然而 CHECK 子句被解析但被 MySQL 的所有存储引擎忽略。