SQL 基础教程
SQL 连接
SQL 高级教程
SQL 参考资料

SQL 约束

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

什么是约束?

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

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

现在,让我们详细讨论这些约束。

NOT NULL 非空约束

NOT NULL 约束指定该列不接受 NULL 值。

这意味着如果在列上应用 NOT NULL 约束,那么您不能在不为该列添加非 NULL 值的情况下在表中插入新行。

下面的 SQL 语句创建一个名为 persons 的表,它有四列,其中三列 idnamephone 不接受 NULL 值。

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

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


PRIMARY KEY 主键约束

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 语句中您不 需要为该列显式分配一个值才能在表中插入新行。


FOREIGN KEY 外键约束

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

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

Foreign Key Relationship Diagram

在 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 的所有存储引擎忽略。

Advertisements