什么是检查约束?

发布于

在数据库术语中,CHECK 约束是一种在数据进入数据库之前对其进行检查的约束。

CHECK 约束有助于维护数据完整性,因为它们可以防止无效数据进入数据库。

当表启用了 CHECK 约束时,数据只有在不违反 CHECK 约束的情况下才能进入该表。违反 CHECK 约束的数据不能进入该表。

创建 CHECK 约束时,您提供了一个用于检查数据的逻辑表达式。每次向表中插入新行或更新现有行时,都会评估与每个 CHECK 约束关联的表达式。如果结果为假,则发生了约束冲突,DBMS通常会引发错误。

检查约束与外键约束

CHECK 约束类似于外键约束,因为它们都控制放入列中的值。但是,不同之处在于它们如何确定哪些值是有效的:

  • 外键约束从另一个表中获取有效值列表
  • CHECK 约束从逻辑表达式中确定有效值。

因此,您的表上将同时具有外键_和_CHECK 约束以及任何数量的其他约束是完全有效的(并且可能是预期的)。

列级与表级

CHECK 约束可以在列级别或表级别定义。

  • 列级 CHECK 约束仅适用于一列中的数据。
  • 表级 CHECK 约束适用于整行,并检查来自多列的数据。

列级

例如,列级 CHECK 约束可能如下所示:

CHECK (Price > 0)

这是一个列级约束,因为它只检查一列(价格列)。

表级

表级 CHECK 约束可能如下所示:

CHECK (Price >= Discount)

这是一个表级约束,因为它检查多个列(Price列_和_Discount列)。

创建 CHECK 约束

CHECK 约束通常作为CREATE TABLE语句的一部分创建。

创建 CHECK 约束的实际语法可能取决于您使用的 DBMS。

下面是使用 SQLite 创建带有 CHECK 约束的表的示例:

CREATE TABLE Products( 
    ProductId INTEGER PRIMARY KEY, 
    ProductName, 
    Price 
    CHECK (Price > 0)
);

在这个示例中,创建了列级 CHECK 约束。

这是在 SQL Server 中创建 CHECK 约束的示例。

将 CHECK 约束添加到现有表

ALTER TABLE一些 DBMS 允许您通过语句将 CHECK 约束添加到现有表。

有关示例,请参阅向 SQL Server 中的现有表添加 CHECK 约束。

其他 DBMS(例如 SQLite)不允许您向现有表添加 CHECK 约束。在这种情况下,您需要删除该表并再次创建它(连同 CHECK 约束)。创建 CHECK 约束后,任何数据都需要传回。

启用/禁用 CHECK 约束

一些 DBMS 提供启用/禁用 CHECK 约束的功能。对于需要插入已知违反现有约束的数据的“特殊情况”,此功能可能很方便,但无论如何您仍然需要插入它。

在 SQLite 中,您可以使用ignore_check_constraintsPRAGMA 语句来启用/禁用所有 CHECK 约束的执行。

在 SQL Server 中,您可以单独启用/禁用它们:

在 SQL Server 中,您还可以在数据库级别启用/禁用所有约束:

SQL Server 还允许您在表级别启用/禁用它们:

此类功能还可能带有其他相关功能,例如选择是否在启用约束之前对现有数据执行检查,以及具有“受信任”标志以指示是否检查了现有数据。

有关此问题的讨论,请参阅在 SQL Server 中启用 CHECK 约束时您应该了解的关于 WITH NOCHECK的内容。