SQL 约束
在本教程中,您将学习如何使用 SQL 约束。
什么是约束?
约束只是对表的一个或多个列施加的限制,以限制可以存储在该列中的值的类型。 约束提供了一种标准机制来维护数据库表中数据的准确性和完整性。
SQL 中有几种不同类型的约束,包括:
现在,让我们详细讨论这些约束。
NOT NULL 非空约束
NOT NULL 约束指定该列不接受 NULL 值。
这意味着如果在列上应用 NOT NULL 约束,那么您不能在不为该列添加非 NULL 值的情况下在表中插入新行。
下面的 SQL 语句创建一个名为 persons 的表,它有四列,其中三列 id、name 和 phone 不接受 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) 是用于在两个表中的数据之间建立和强制关系的列或列组合。
这是一个示例图,显示了 employees 和 departments 表之间的关系。 如果你仔细看,你会注意到 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 的所有存储引擎忽略。
