使用检查约束验证SQL Server中的数据
2009-04-16 10:27:11 来源:WEB开发网INSERTINTOdbo.Payrollvalues(1,1,'Hourly',25.00);
INSERTINTOdbo.Payrollvalues(2,2,NULL,25.00);
INSERTINTOdbo.Payrollvalues(3,3,'Horly',25.00);
你认为将会发生什么?只有第一条INSERT语句会起作用吗?第二条和第三条INSERT将会怎么样?它们都会违反CK_Payroll_SalaryType吗?结果是只有第三条INSERT语句会失败,它之所以失败是因为SalaryType被打乱了,不再仅仅是“Hourly”,“Monthly”或“Annual”了,那为什么第二个INSERT语句没有返回FALSE呢?很明显,NULL(空值)也不是有效的SalaryType,第二条INSERT语句能够工作的原因是它运行时CK_Payroll_SalaryType约束没有返回FALSE值,所以数据库引擎就插入了第二条记录。
为什么会这样呢?因为NULL(空值)在比较操作中时会返回UNKNOWN,因为UNKNOWN并不等价于FLASE,故没有违反检查约束。因此,你在写检查约束时要当心,你可能想要排除掉包含NULL(空值)的值。上面的例子如果想要排除掉NULL(空值),那代码要做如下的改动:
ALTERTABLEdbo.Payroll
WITHNOCHECKADDCONSTRAINTCK_Payroll_SalaryType
CHECK((SalaryTypein('Hourly','Monthly','Annual'))
andSalaryTypeisnotNULL);
另一个选择是将SalaryType列设置为一个NOTNULL字段,这样之后就不用再创建一个检查约束了,但你会获得一个不能向表中插入NULL值的错误消息。
通过检查约束进行数据验证
使用检查约束后,可以确保你的数据库只包括通过了检查的数据,这样允许你让数据库引擎控制你的数据有效性,这样做之后,你的应用程序就不用再进行数据验证了,否则程序代码中到处都穿插有数据校验的脚本,通过这种方法使数据验证工作更轻松,更简洁。
更多精彩
赞助商链接