SQL 约束
在本教程中,你将学习如何使用 SQL 约束。
什么是约束?
约束只是对表的一列或多列的限制,以限制可以存储在该列中的值的类型。约束提供了一种标准机制来维护表中数据的准确性和完整性。
SQL 中有几种不同类型的约束,包括:
NOT NULL
PRIMARY KEY
UNIQUE
DEFAULT
FOREIGN KEY
CHECK
现在,让我们详细讨论这些约束中的每一个。
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
不等于零(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)是列或列的组合,用于建立和强制两个表中的数据之间的关系。
这是一个示例图,显示了 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 的所有存储引擎忽略。