SQL Server Check 约束将限制插入到表列中的数据。因此,例如,如果我们想限制电话号码的位数或将客户年龄限制在 18 到 60 岁之间,那么我们可以为该列分配 Check 约束。
让我们通过示例了解如何使用 transact 查询和 Management Studio 分配 SQL Server Check 约束。在此演示中,我们使用 Customer Records 表。

让我更新 Custkey = 4 的年龄。请参阅 UPDATE 语句 以了解以下 SQL Server 语句。
UPDATE [dbo].[CustomerRecords] SET [Age] = -150 WHERE [CustKey] = 4 GO
尽管在大多数情况下,任何人的年龄都在 0 到 100 之间,或者在极少数情况下在 0 到 150 之间。我们的年龄列接受负值,这在实时中是不正确的。我们必须使用 Check 约束来处理这种情况。
Messages
--------
(1 row(s) affected)
使用 Management Studio 创建 SQL Server Check 约束
在我们开始工作之前,让我向您展示表中的最终数据

在此示例中,我们将向您展示如何使用 Management Studio 创建检查。
在对象资源管理器中,展开表所在的数据库文件夹。请选择要创建 SQL Check 约束的表(此处为 CustomerRecords)。接下来,转到“约束”文件夹,右键单击它将打开上下文菜单。请选择“新建约束...”选项。

选择“新建”选项后,Management Studio 将以设计模式打开相应的表。它将显示一个“检查”弹出窗口。

要启用 Check 约束,我们必须在 Expression 属性中提供一个布尔表达式。因此,让我单击 Expression 旁边的“...”按钮。

正如您所看到的,我们正在编写一个简单的表达式 Age > 0 AND Age < 120。这意味着年龄应该在 0 到 120 之间。

接下来,我们将 SQL Server Check 约束名称重命名为 CK_CustomerRecords_Age。请根据您的要求更改名称,并提供有效的描述。除了这三个,还有一个重要的属性
- Check Existing Data On Creation or Re-Enabling:此属性具有布尔值 Yes 或 No 选项。如果您将其设置为 Yes,则 Check 约束将根据现有记录测试表达式。否则,它将仅检查新记录。因此,让我将其保留为默认的 Yes。

让我保存表设计。

它正在抛出错误。因为 Customer Records 表中有一个值不满足表达式(-150 不在 0 到 120 之间)

让我将 Check Constraint Existing Data On Creation or Re-Enabling 属性更改为 No。这意味着它将不关心现有记录。它将仅测试新记录的表达式。或者,您可以 删除 或更新包含 -150 值的记录。

现在您可以看到我们新创建的 Check 约束。为此,请转到对象资源管理器 -> 数据库 -> 表名 -> 展开“约束”文件夹

在 SQL Server Check 约束列中插入值
让我使用 INSERT 语句 向表中插入一个值。
INSERT INTO [dbo].[CustomerRecords]
([CustKey], [FirstName], [LastName], [Age], [EmailAddress], [Yearly Income], [Profession])
VALUES (5, 'SQL', 'Tutorials', 175, 'abmx@abd.com', 92500, 'Author')

它正在返回一个错误。这是因为我们插入的 Age 值为 175,而 175 不在 0 到 120 之间。让我们尝试一个负值。正如您所看到的,它也抛出了相同的错误。
INSERT INTO [dbo].[CustomerRecords]
([CustKey], [FirstName], [LastName], [Age], [EmailAddress], [Yearly Income], [Profession])
VALUES (5, 'SQL', 'Tutorials', -17, 'abmx@abd.com', 92500, 'Author')

这次我们将尝试正确的值,您可以看到我们的插入是成功的。
INSERT INTO [dbo].[CustomerRecords]
([CustKey], [FirstName], [LastName], [Age], [EmailAddress], [Yearly Income], [Profession])
VALUES (5, 'SQL', 'Tutorials', 17, 'abmx@abd.com', 92500, 'Author')
Messages
--------
(1 row(s) affected)
让我们看看表中的总记录。
SELECT [CustKey]
,[FirstName]
,[LastName]
,[Age]
,[EmailAddress]
,[Yearly Income]
,[Profession]
FROM [CustomerRecords]

使用查询对现有表进行 SQL Check 约束
在开始之前,让我向您展示表中的最终数据

在此示例中,我们将展示如何向现有表添加检查约束。要添加此项,我们使用 Alter Table 语句来更改表内容。然后我们使用 ADD CONSTRAINT 语句添加。
ALTER TABLE[CustomerRecords] ADD CONSTRAINT CK_CustomerRecords_Age CHECK([Age] > 0 AND [Age] < 120) GO
Messages
--------
Command(s) completed successfully.
让我插入一个负值。
INSERT INTO [dbo].[CustomerRecords]
([CustKey], [FirstName], [LastName], [Age], [EmailAddress], [Yearly Income], [Profession])
VALUES (6, 'SQL', 'Server', -25, 'abmx@abd.com', 92500, 'Author')

在 SQL Check 约束中插入 NULL
当我们向 Check 约束列中插入 NULL 值时会发生什么?首先,让我将 NULL 值插入到 Age Address 列中。
INSERT INTO [dbo].[CustomerRecords]
([CustKey], [FirstName], [LastName], [Age], [EmailAddress], [Yearly Income], [Profession])
VALUES (6, 'SQL', 'Server', NULL, 'abmx@abd.com', 2500, 'SQL Author')
Messages
--------
(1 row(s) affected)
它已将 NULL 值插入到 Check 约束中。因为 NULL 值的表达式结果返回未定义(既不是 TRUE 也不是 FALSE),所以它允许该记录。

在多个列上创建检查
此示例在多个列上创建了一个 Check 约束。以下代码将限制用户输入小于 18 岁的年龄和大于 100000 的年收入
ALTER TABLE[CustomerRecords] ADD CONSTRAINT CK_CustomerRecords_AgeAndIncome CHECK([Age] >= 18 AND [YearlyIncome] <= 100000) GO
在表创建时创建 SQL Check 约束
在这里,我们将向您展示如何在表创建时创建 Check 约束。请参阅 Create Table 文章。
CREATE TABLE [dbo].[CustomerRecords2]( [CustKey] [int] NOT NULL PRIMARY KEY, [FirstName] [varchar](50) NOT NULL, [LastName] [varchar](50) NULL, [Age] [int] NULL, [EmailAddress] [nvarchar](50) NULL, [Yearly Income] [money] NULL, [Profession] [nvarchar](100) NULL, CONSTRAINT CK_CustomerRecords_AgeColumn CHECK([Age] > 0 AND [Age] < 120) ) GO
Messages
-------
Command(s) completed successfully.
使用 transact 查询删除 SQL Check 约束
如果您知道要删除的名称,请编写 DROP Constraint 语句以及 ALTER TABLE Statement transact 查询。
ALTER TABLE [dbo].[CustomerRecords] DROP CONSTRAINT CK_CustomerRecords_Age; GO
Messages
-------
Command(s) completed successfully.
如果您不知道名称,请使用以下 SELECT 语句 获取名称。
SELECT name, create_date FROM sys.check_constraints WHERE OBJECT_NAME(parent_object_id) = N'CustomerRecords'; GO

获取名称后,您可以使用 ALTER TABLE 语句将其删除。
使用 SSMS 删除
在对象资源管理器中,展开“数据库”文件夹和 CustomerRecords 表以查找并删除“Check Constraints”文件夹。右键单击该文件夹并选择“删除”选项。

选择“删除”选项后,将打开一个新的“删除对象”窗口。单击“确定”将其删除。
