创建和修改 CHECK 约束

创建表时,可以创建 CHECK 约束作为表定义的一部分。如果表已经存在,则可以添加 CHECK 约束。表和列可以包含多个 CHECK 约束。

如果已存在 CHECK 约束,则可以修改或删除它。例如,可能需要修改表中某列的 CHECK 约束使用的表达式。

注意注意

必须首先删除现有的 CHECK 约束,然后使用新定义重新创建,才能修改 CHECK 约束。

下面的 Transact-SQL 示例创建一个新表,然后通过将 CHECK 约束添加到 CreditRating 列来修改此表。

IF OBJECT_ID ('dbo.Vendors', 'U') IS NOT NULL
DROP TABLE dbo.Vendors;
GO
CREATE TABLE dbo.Vendors 
    (VendorID int PRIMARY KEY, VendorName nvarchar (50), 
    CreditRating tinyint)
GO
ALTER TABLE dbo.Vendors ADD CONSTRAINT CK_Vendor_CreditRating
    CHECK (CreditRating >= 1 AND CreditRating <= 5)

删除 CHECK 约束可以取消对约束表达式所包含列中可接受数据值的限制。

在创建表时创建 CHECK 约束

在现有的表中创建 CHECK 约束

删除 CHECK 约束

使用 WITH NOCHECK 强制执行 CHECK 约束

向现有表中添加 CHECK 约束后,CHECK 约束可以仅应用于新数据,也可以应用于现有数据。默认情况下,CHECK 约束同时应用于现有数据和所有新数据。使用 ALTER TABLE 语句的 WITH NOCHECK 选项可以将新约束仅应用于新添加的数据。如果现有数据已符合新的 CHECK 约束时,或业务规则要求仅从此开始强制约束时,则可以使用此选项。

例如,旧约束可能要求将邮政编码限制为 5 位数字,而新约束要求 9 位数字的邮政编码。5 位数字的旧邮政编码数据依然有效,并且将与 9 位数字的新邮政编码数据共存。因此,只须按新的约束对新邮政编码进行检查。

但是,添加约束但不检查现有数据时应谨慎,因为这样会跳过 数据库引擎中用于强制表的完整性规则的控制。

创建 CHECK 约束时不对现有数据进行检查

禁用 CHECK 约束

可以对特定操作(例如 INSERT 操作、UPDATE 操作和复制处理)禁用现有的 CHECK 约束。

  • INSERT 和 UPDATE 语句

    禁用 CHECK 约束使表中的数据不经约束验证便可修改。在执行 INSERT 和 UPDATE 语句时,如果新数据违反约束或约束应仅应用于数据库中已有的数据,则禁用 CHECK 约束。

  • 复制处理

    如果约束是源数据库特有的,应在复制过程中禁用 CHECK 约束。复制表时,将把表定义和数据从源数据库复制到目标数据库。这两个数据库通常(但不一定)位于不同的服务器上。如果未禁用源数据库所特有的 CHECK 约束,则它们可能会无谓地妨碍向目标数据库输入新数据。有关详细信息,请参阅使用 NOT FOR REPLICATION 来控制约束、标识和触发器

执行 INSERT 和 UPDATE 语句时禁用 CHECK 约束

复制时禁用 CHECK 约束

获取有关 CHECK 约束的信息

请参阅

概念