SQL 约束(Constraints)

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

什么是约束?

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

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

现在,让我们详细讨论每个约束。

NOT NULL约束

该NOT NULL限制指定列不接受NULL值。

这意味着,如果NOT NULL对列施加约束,那么您必须在表中插入新行而不为该列添加非NULL值。

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

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

注意:空值或NULL不同于零,空白或长度为零的字符串,例如''。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列指定为unique。这意味着该字段不允许重复值。

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语句为“ 国家/地区”列创建一个默认值。

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表的主键列匹配。因此,dept_id为的列名员工表的外键的部门表。

外键关系图

在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检查约束。 虽然,MySQL的所有存储引擎都会解析CHECK子句,但会将其忽略。