当前位置: 首页 > 图文教程 > 数据库 > MSSQL > SQL Server:小编浅谈数据库完整性之约束

MSSQL
SQL Server 中死锁产生的原因及解决办法
教你在SQL Server 2000数据库中使用分区
数据仓库基本报表制作过程中的SQL写法
自动定时重启sql server回收内存
轻松解决SQL Server 2005中的常见问题
用一个案例讲解SQL Server数据库恢复
安装SQL Server 2005时出现计数器错误
讲解SQL Server 2005数据库的同义词Bug
利用SQL语句对不同数据库进行高效果分页
三种数据库利用SQL语句进行高效果分页
数据库连接字符串的常见问题和解决方法
教你快速掌握一些方便易用的SQL语句
深入分析SQL Server的数据转换服务
系统默认的MySQL用户名消失的解决方法
SQL 2008邮件故障排除:发送测试电子邮件
SQL Server 2005日志文件损坏的处理方法
在SQL Server 2005数据库中进行错误捕捉
SQL Server查询速度慢原因及优化方法
加密SQL Anywhere 提升政府行业数据安全
Windows Server 2008之数据安全保护

MSSQL 中的 SQL Server:小编浅谈数据库完整性之约束


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 184 ::
收藏到网摘: n/a

数据库中完整性( i n t e g r i t y )一词指数据的正确性和相容性。一个给定的数据库可能受到多个完整性约束的限制,可能是简单的也可能是复杂的。比如,在供应商-零件例子中,供应商号码可能是Sn n n n ( n n n n 14位整数),并且这一编号是唯一的;状态值可能在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(供应商约束3suppliers 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),因为多达百分之九十的数据

库定义中包含约束。一个提供对约束的声明支持的数据库将在相当程度上减轻程序员的

负担并使他们的生产率更高。对约束的声明支持是相当重要的。

在进一步讨论这个问题之前,可以说:在关系模型中,完整性是在这些年里变化最大

的(可能应该说“演化”而不是“变化”)。最初,主码和外码(简称为“码”)是人们关注的重点,逐渐地,完整性约束的重要性—普遍存在,且具有毫无争议的重要性—得到人们的普遍理解和广泛重视。同时,关于码的一些讨厌的细节问题不断出现。本章的结构体现了这一重点的转变。我们先介绍完整性约束(仅在一定程度上讨论),然后讨论“码”,因为在应用中,“码”这一概念还有相当的重要性。

“约束”的分类

大体上完整性约束可分为四大类:类型(域)约束、属性约束、关系变量约束和数据库约束。

 

类型约束指明给定类型的合法取值。注意:在本章中,我们用“类型”表示一个标

量类型。关系类型也受类型约束的制约,但是,这种关系类型的约束只是表示:关

系类型是通过标量类型来定义,而标量类型受到约束,这一逻辑结果就是关系类型

也受类型约束制约。

属性约束说明属性的合法取值。

关系变量约束说明关系变量的合法取值。

数据库约束说明数据库的合法取值。