SQL Check 约束

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)。接下来,转到“约束”文件夹,右键单击它将打开上下文菜单。请选择“新建约束...”选项。

Choose Add New SQL Check Constraint 4

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

Table in Design Mode 5

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

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

Expression for the SQL Check Constraint 7

接下来,我们将 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 值的记录。

Set Existing Data on Creating Option to No \ Yes 11

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

Check Constraint 12

在 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')
Check Constraint conflict Error 14

这次我们将尝试正确的值,您可以看到我们的插入是成功的。

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]
Check Constraint 16

使用查询对现有表进行 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),所以它允许该记录。

Insert Nulls in Check Constraint 23

在多个列上创建检查

此示例在多个列上创建了一个 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”文件夹。右键单击该文件夹并选择“删除”选项。

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

Delete Check Constraint 18