在SQL Server中使用检查约束来验证数据
2009-05-09 10:28:44 来源:WEB开发网了解当值为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值到你的表中。
通过检查约束进行数据验证
通过使用检查约束,你可以确保你的数据库只包含通过了约束的数据。这使得你可以让数据库引擎控制你的数据验证。这么做将使得你的应用程序不需要在每个你希望插入一条记录或更新一条记录到一个表中的地方都写数据验证规则的代码。检查约束是执行数据验证的一个简洁方法。
- ››sql server自动生成批量执行SQL脚本的批处理
- ››使用linux中的quota教程
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››sqlserver安装和简单的使用
- ››SQL Sever 2008 R2 数据库管理
- ››使用jxl生成带动态折线图的excel
- ››SQL SERVER无法安装成功,sqlstp.log文件提示[未发...
- ››Sql Server中通过父记录查找出所有关联的子记录
- ››SqlServer触发器、存储过程和函数
- ››SQL Server 中的事务(含义,属性,管理)
- ››Sqlite数据库插入和读取图片数据
更多精彩
赞助商链接