在SQL Server数据库中加强数据的完整性(三)

日期: 2008-11-13 作者:SearchSQLServer.com翻译:April 来源:TechTarget中国 英文

以下脚本创建了vehicle表。你会发现这个脚本和创建先前的那个表的脚本有些不同。首先,在我们设立objid列时,我们用的是IDENTITY(1,1)语句创建的一个恒等式,列中的增量为1。第二,另外一个CONSTRAINT语句增加了外键的关系。

在创建外键时,你在参考表中指定包含外键、参考表一个列或列组合和包含主键的列组合。 CREATE TABLE dbo.vehicle(  objid int IDENTITY(1,1) NOT NULL,  make varchar(50) NOT ……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

以下脚本创建了vehicle表。你会发现这个脚本和创建先前的那个表的脚本有些不同。首先,在我们设立objid列时,我们用的是IDENTITY(1,1)语句创建的一个恒等式,列中的增量为1。第二,另外一个CONSTRAINT语句增加了外键的关系。在创建外键时,你在参考表中指定包含外键、参考表一个列或列组合和包含主键的列组合。


CREATE TABLE dbo.vehicle( 
objid int IDENTITY(1,1) NOT NULL, 
make varchar(50) NOT NULL, 
model varchar(50)NOT NULL, 
year char(4) NOT NULL, 
employee_objid int NOT NULL, 
CONSTRAINT PK_vehicle PRIMARY KEY (objid), 
CONSTRAINT FK_vehicle_employee 
FOREIGN KEY(employee_objid) 
REFERENCES employee (objid) 
)

  如果你的主键位置适当,创建外键就很不切实际了。你只要在参考表中创建合适的列并增加外键。在第二章开始时我们已经谈到,如果你在设计时需要,表中同样的列可以同在主键和外键中。

  创建外键时,你还能够指定升级或删除父级表时做什么。通过默认,如果你想删除父级表中的记录,由于它会造成参考表中的行与行之间的孤立,所以删除操作就失败了。一个孤立的行就是存在于子级表中没有父级表与之对应的表。它能在数据模块中造成两个问题。在我们的employee 和vehicle表中,vehicle表中的NULL值表示vehicle没有和employee匹配。但是考虑到在表中保存了命令和命令的一些细节,这种情况下,命令细节表中孤立的记录就没有用。你就不知道那条命令是属于哪一行的。

  你还可以选择其他的方法来避免删除失败。首先,你可以进行删除造作级联,就是说SQL Server将删除你想删除的所有子级行和父级行。采用该选项时,你千万要小心。如果你有一些关系并激活了级联删除,你就可以通过删除单个的记录删除很多数据。

  第二个选项就是让SQL Server对参考表中的NULL值设置外键列。该选项创建了孤立的选项,这在前面也已经讨论过。第三,如果有的默认值的话,你可以让SQL Server设置外键列返回到列中的默认值中。如果要更新主键值本身的话,你还可以采用其他的选项。同样,SQL Server能够:(1)进行级联更新,这样子级行就指向正确的、带有新键的父级行;(2)将外键设置为NULL;或者(3),设置外键恢复其默认值。通常我们并不建议你改变主键的值,但是在很多情况下你会发现你需要这么做。如果你发现在那种情况下需要这么做,那就考虑在外键上设置更新规则。

  约束

  SQL Server包含一些加强数据完整性的约束条件。约束,就如同名字暗含的一样,常常用来约束添加到列中的值。我们已经讨论过SQL Server中的两种约束:主键和外键。主键约束数据,这样副本和NULL值就不会存在于列中。外键保证了添加的值存在于参考表中。你还能实施其他的约束保证数据完整性或加强事务规则。

  唯一性约束

  唯一性约束和主键约束一样,它们确保副本不在列或列集合中。它们在没有包含主键的列中进行配置。唯一性约束和主键之间的区别是什么呢?在技术角度来看,这二者之间唯一的不同就是唯一性主键允许你添加NULL值。但是由于这些值是唯一值,你只能在整个列中添加一个NULL值。我们说识别主键时,那是在说候选键。因为候选键还应该识别行,你应该在候选键上设置唯一性约束。增加唯一性约束和增加外键的方法一样,都是用类似以下的约束语句:

CONSTRAINT UNQ_vehicle_vin UNIQUE NONCLUSTERED (vin_number)

  检查约束

  检查约束限制了逻辑表达式添加到列中的值。一个逻辑表达式就是任意一个能得出TRUE或FALSE值的SQL表达式。该表达式可以是任意有效的SQL表达式,从简单的比较到复杂的函数。例如,我们想限定添加到工资表中的值。我们用以下表达式对数据进行判断:


salary >= 10000 and salary <=150000

  此行就否决了小于10000或大于150000的值。

  每个列都包含多个检查约束,你或者还可以参考共有一个查询的多个列。在检查约束进行数据判断或评估时,它会允许评估结果正确的值。也就是说如果你的查询判断数据为NULL,那么该之就可以接受。因此如果你将NULL值添加到设计中,但是该检查约束返回的是未知的插入值。这项功能是设计好的,但是它也会导致一个始料未及的结果,所以我们要警惕。


ALTER TABLE dbo.Products 
ADD CONSTRAINT chk_non_negative_values
CHECK
(
weight >= 0
AND (shippingweight >= 0 AND shippingweight >= weight) 
AND height >= 0
AND width >= 0
AND depth >= 0
)

  因为那些包含负数的列没有任何意义(重量和高度不能是负数),我们就增加了约束保证数据完整性。现在你想插入负数值时,SQL Server就会返回以下的错误并且拒绝插入数据。约束还防止了装货重量比实际重量要小。


The INSERT statement conflicted with the CHECK constraint
"chk_non_negative_values"

翻译

April
April

相关推荐