WEB开发网
开发学院数据库MSSQL Server 在SQL Server中使用检查约束来验证数据 阅读

在SQL Server中使用检查约束来验证数据

 2009-05-09 10:28:44 来源:WEB开发网   
核心提示: 了解当值为Null时会发生什么回忆下在本篇文章的“什么是检查约束”章节中所说的关于记录是怎样只在检查约束得出结果FALSE时才认为检查约束没有通过,因此,在SQL Server中使用检查约束来验证数据(5),字段中的NULL值可能允许你输入数据到你的数据库中,而这并

了解当值为Null时会发生什么

回忆下在本篇文章的“什么是检查约束”章节中所说的关于记录是怎样只在检查约束得出结果FALSE时才认为检查约束没有通过。因此,字段中的NULL值可能允许你输入数据到你的数据库中,而这并不满足你的需求。

假设我在我的payroll表上只有CK_Paryroll_SalaryType 检查约束。这里需要回忆的就是这个检查约束:

      ALTER TABLE dbo.Payroll
  WITH NOCHECK ADD CONSTRAINT CK_Payroll_SalaryType

  CHECK (SalaryType in ('Hourly','Monthly','Annual'));

现在你运行下面的INSERT语句:

INSERT INTO dbo.Payroll values (1, 1, 'Hourly',25.00);

INSERT INTO dbo.Payroll values (2, 2, NULL, 25.00);

INSERT INTO dbo.Payroll values (3, 3, 'Horly',25.00);

会发生什么?会只有第一个INSERT语句起作用吗?第二个和第三个INSERT语句会怎样?它们都违反CK_Payroll_SalaryType吗?结果是只有第三个INSERT语句失败了。它失败是由于SalaryType输入错误,它不是“Hourly”、“ Monthly”或“Annual”。为什么第二个INSERT没有得出false呢?显然,“NULL”不是SalaryTypes的有效值。第二个INSERT语句起作用的原因是在第二个INSERT语句运行时,CK_Payroll_SalaryType约束不是FALSE。因此,数据库引擎插入了这条记录。那么为什么会出现这种情况呢?这是因为NULL值用在比较操作中时,它被当作UNKNOWN。因为UNKNOWN不是FALSE,所以没有违反检查约束。因此,当你编写你的检查约束时,你需要对需要拒绝包含NULL值的地方很谨慎。另一个编写上面的约束从而使得拒绝SalaryType值为NULL的方法是如下编写你的约束:

      ALTER TABLE dbo.Payroll
  WITH NOCHECK ADD CONSTRAINT CK_Payroll_SalaryType

  CHECK ((SalaryType in ('Hourly','Monthly','Annual'))

  and SalaryType is not NULL);

另一个选择是使SalaryType成为一个非NULL字段。如果你这么做就不会违反检查约束,但是反过来你会得到一个错误信息显示你不能插入一个NULL值到你的表中。

通过检查约束进行数据验证

通过使用检查约束,你可以确保你的数据库只包含通过了约束的数据。这使得你可以让数据库引擎控制你的数据验证。这么做将使得你的应用程序不需要在每个你希望插入一条记录或更新一条记录到一个表中的地方都写数据验证规则的代码。检查约束是执行数据验证的一个简洁方法。

上一页  1 2 3 4 5 

Tags:SQL Server 使用

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接