SQL Server数据库完整性之约束


SQL #sql server #完整性2012-10-23 17:11
数据库中完整性( i n t e g r i t y )一词指数据的正确性和相容性。一个给定的数据库可能受到多个完整性约束的限制,可能是简单的也可能是复杂的。比如,在供应商-零件例子中,供应商号码可能是Sn n n n ( n n n n 为1到4位整数),并且这一编号是唯一的;状态值可能在1~1 0 0的范围内;伦敦的供应商状态值必须是2 0;发货量必须是5 0的倍数;颜色为“红”的零件必须被存放在伦敦;等等。通常, D B M S都被告知存在这样的约束,当然,也能在一定程度上实现这样的约束(一般是通过拒绝违反这些约束的更新请求来实现)。例如(再次引用Tutorial D):
CONSTRAINT SC3
      IS_EMPTY(S WHERE  STATUS <1 OR  STATUS >100)
(状态值必须在1 ~ 1 0 0范围内)。这个约束被命名为S C 3(供应商约束3,suppliers constraint3);这个约束将以此名在系统目录( system catalog)中注册,当系统对企图违反这个约束的操作作出响应时,这个名字将在诊断提示信息中出现。此约束本身被指定为一个布尔表达式,并且,其值不可为假。
注意:为明确起见,我们采用Tutorial D 的代数形式;所以,这个布尔表达式常常采
取(虽然并非一成不变)如下的形式: I S E M P T Y ( . . . ),意思是数据库中没有违反这个约束的元组。这个例子的演算描述为:
CONSTRAINT SC3
      FORALL  SX  (SX.STATUS >= 1 AND SXSTATUS <=100)
( SX 是定义在供应商上的一个范围变量)。
另外我们注意到以演算约束形式存在的布尔表达式必须是一个封闭的合式公式,并且常(但并非一成不变)采用FORALL x( . . . )的形式。这样,这个例子
约束所有的供应商状态值必须在指定的范围内。实际上,对于一个数据库系统,只要检
查新插入或更新的“供应商”记录就可以了,而不用检查所有的供应商记录。
当声明一个新的约束时,系统首先要确保当前系统满足这个约束。如果当前系统不满
足这个约束,这个新约束就被拒绝;反之,则被接受(也就是被存储在目录中),从此新
的约束开始生效。此后, D B M S就要监视每一个插入的“供应商”记录和会引起已存在供
应商记录状态值变动的操作。
当然,我们也要有能够解除已存在约束的方法。
DROP CONSTRAINT <constraint name>;
例如:
DROP CONSTRAINT SC3;
 
注意:正像下面的讨论所指出的,我们将尤其关注声明完整性支持。遗憾的是,即使
现在,也几乎没有什么产品能在这方面做得很好。但在这一点上是不断进步的,虽然目
前一些数据库产品(尤其是非关系数据库)还特别强调一种与此相反的方法—也就是
对约束的“过程支持”(procedural support),通过存储过程和触发过程来实现。但是,
建议一个D B M S提供对约束的声明支持( declarative support),因为多达百分之九十的数据
库定义中包含约束。一个提供对约束的声明支持的数据库将在相当程度上减轻程序员的
负担并使他们的生产率更高。对约束的声明支持是相当重要的。
在进一步讨论这个问题之前,可以说:在关系模型中,完整性是在这些年里变化最大
的(可能应该说“演化”而不是“变化”)。最初,主码和外码(简称为“码”)是人们关注的重点,逐渐地,完整性约束的重要性—普遍存在,且具有毫无争议的重要性—得到人们的普遍理解和广泛重视。同时,关于码的一些讨厌的细节问题不断出现。本章的结构体现了这一重点的转变。我们先介绍完整性约束(仅在一定程度上讨论),然后讨论“码”,因为在应用中,“码”这一概念还有相当的重要性。
“约束”的分类
大体上完整性约束可分为四大类:类型(域)约束、属性约束、关系变量约束和数据库约束。
 
• 类型约束指明给定类型的合法取值。注意:在本章中,我们用“类型”表示一个标
量类型。关系类型也受类型约束的制约,但是,这种关系类型的约束只是表示:关
系类型是通过标量类型来定义,而标量类型受到约束,这一逻辑结果就是关系类型
也受类型约束制约。
• 属性约束说明属性的合法取值。
• 关系变量约束说明关系变量的合法取值。
•数据库约束说明数据库的合法取值。

相关文章

粤ICP备11097351号-1