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