MySQL 约束

2025年3月17日 | 阅读 7 分钟

MySQL 中的约束用于指定允许或限制在表中存储哪些值/数据的规则。它们提供了一种合适的方法来确保表中数据的准确性和完整性。它还有助于限制将要插入到表中的数据类型。如果在约束和数据操作之间发生任何中断,则该操作将失败。

MySQL 约束的类型

MySQL 中的约束分为两种类型

  1. 列级约束:这些约束仅应用于单个列,限制特定列的数据类型。
  2. 表级约束:这些约束应用于整个表,限制整个表的数据类型。

如何在 MySQL 中创建约束

我们可以在使用 CREATE TABLE 语句创建表时定义约束。MySQL 也使用 ALTER TABLE 语句来为现有表模式指定约束。

语法

以下是创建表约束的语法

MySQL 中使用的约束

以下是 MySQL 中最常用的约束

  • NOT NULL
  • CHECK
  • DEFAULT
  • PRIMARY KEY
  • AUTO_INCREMENT
  • UNIQUE
  • INDEX
  • ENUM
  • FOREIGN KEY

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

NOT NULL 约束

此约束指定列不能包含 NULL 或空值。以下语句创建了一个带有 NOT NULL 约束的表。

执行下面列出的查询以了解其工作原理

输出

MySQL Constraints

在上面的图片中,我们可以看到第一个 INSERT 查询正确执行,但第二个语句失败并报错,提示列 LastName 不能为 null。

UNIQUE 约束

此约束确保插入到列中的所有值都是唯一的。这意味着一个列不能存储重复值。MySQL 允许我们在一个表中使用多个带有 UNIQUE 约束的列。以下语句创建了一个带有 UNIQUE 约束的表

执行下面列出的查询以了解其工作原理

输出

在下面的输出中,我们可以看到第一个 INSERT 查询正确执行,但第二个语句失败并报错,提示:键 BrandName 的重复条目“Cantabil”。

MySQL Constraints

CHECK 约束

它控制特定列中的值。它确保插入到列中的值必须满足给定条件。换句话说,它根据给定条件确定与列关联的值是否有效。

在 8.0.16 版本之前,MySQL 使用此约束语法的有限版本,如下所示

在 8.0.16 版本之后,MySQL 对所有存储引擎(即表约束和列约束)使用 CHECK 约束,如下所示

让我们了解 CHECK 约束如何在 MySQL 中工作。例如,以下语句创建了一个名为“Persons”的表,其中“Age”列包含 CHECK 约束。CHECK 约束确保插入到列中的值必须满足给定条件,即一个人的年龄应大于或等于 18 岁

执行列出的查询以将值插入到表中

输出

在下面的输出中,我们可以看到第一个 INSERT 查询成功执行,但第二个语句失败并报错,提示:键 Age 的 CHECK 约束被违反。

MySQL Constraints

DEFAULT 约束

此约束用于为未指定任何值的特定列设置默认值。这意味着该列必须包含一个值,包括 NULL。

例如,以下语句创建了一个名为“Persons”的表,其中“City”列包含 DEFAULT 约束。如果我们没有为 City 列指定任何值,它将插入默认值

执行列出的查询以将值插入到表中

输出

在下面的输出中,我们可以看到包含所有字段的第一个插入查询成功执行,而第二个插入语句不包含“City”列但也成功执行。这是因为它有一个默认值。

MySQL Constraints

现在,执行以下语句以验证第 4 列的默认值

我们可以看到它完美地工作。这意味着默认值“New York”自动存储在 City 列中。

MySQL Constraints

PRIMARY KEY 约束

此约束用于唯一标识表中的每条记录。如果列包含主键约束,则它不能为 null 或为空。一个表可能包含重复的列,但它只能包含一个主键。它总是包含列中的唯一值。

以下语句创建了一个名为“Person”的表,并更清楚地解释了此主键的使用

接下来,使用 insert 查询将数据存储到表中

输出

在下面的输出中,我们可以看到第一个插入查询成功执行。而第二个插入语句失败并报错,提示:主键列的重复条目。

MySQL Constraints

AUTO_INCREMENT 约束

每当我们向表中插入新记录时,此约束都会自动生成一个唯一的数字。通常,我们为表中的主键字段使用此约束。

我们可以通过以下示例来理解它,其中 Animal 表中的 id 列将自动递增

接下来,我们需要将值插入到“Animals”表中

现在,执行以下语句以获取表数据

输出

在输出中,我们可以看到我没有为自动递增列指定任何值,因此 MySQL 会自动为该字段按顺序生成一个唯一的数字。

MySQL Constraints

ENUM 约束

MySQL 中的 ENUM 数据类型是一个字符串对象。它允许我们在创建表时,将列中选择的值限制为列规范中允许值列表中的值。它是 enumeration 的缩写,这意味着每个列可能具有指定可能值中的一个。它使用数字索引(1、2、3…)来表示字符串值。

以下示例创建了一个名为“shirts”的表,其中包含三列:id、name 和 size。“size”列使用 ENUM 数据类型,包含 small、medium、large 和 x-large 尺寸。

接下来,我们需要使用以下语句将值插入到“Shirts”表中

现在,执行 SELECT 语句以查看插入到表中的值

输出

我们将得到以下输出

MySQL Constraints

INDEX 约束

此约束允许我们非常快速轻松地从表中创建和检索值。索引可以使用一个或多个列创建。它以插入表的方式为每行分配一个 ROWID。

以下示例创建了一个名为“shirts”的表,其中包含三列:id、name 和 size。

接下来,我们需要使用以下语句将值插入到“Shirts”表中

现在,执行此语句以创建索引

我们可以使用下面的查询通过索引列检索数据

输出

出现以下输出

MySQL Constraints

外键约束

此约束用于将两个表连接在一起。它也称为引用键。外键列匹配另一个表的主键字段。这意味着一个表中的外键字段引用另一个表的主键字段。

让我们考虑这些表的结构:Persons 和 Orders。

表:Persons

表:Orders

在上面的表结构中,我们可以看到“Orders”表中的“Person_ID”字段指向“Persons”表中的“Person_ID”字段。“Person_ID”是“Persons”表中的 PRIMARY KEY,而“Orders”表的“Person_ID”列是 FOREIGN KEY。

输出

我们的表包含以下数据

MySQL Constraints