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

MSSQL
Microsoft SQLServer的版本区别及选择
在SQL Server数据库中为标识(IDENTITY)列插入显式值
访问和更改关系数据,使用MSSQL外联接
一个查看MSSQLServer数据库空间使用情况的存储过程 SpaceUsed
SQL语句去掉重复记录,获取重复记录
复习一下sql server的差异备份
SQL中object_id函数的用法
SQL Server日期计算
找回SQL企业管理器里的SQL连接的密码的方法
mssql数据库系统崩溃后的一般处理步骤与方法
海量数据库的查询优化及分页算法方案
SQL Server连接中三个常见的错误分析
在程序中压缩sql server2000的数据库备份文件的代码
MS SQL SERVER 数据库日志压缩方法与代码
如何远程连接SQL Server数据库的图文教程
复制SqlServer数据库的方法
搜索sql语句
sql中返回参数的值
sql中生成查询的模糊匹配字符串
将Session值储存于SQL Server中

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 87 ::
收藏到网摘: 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),因为多达百分之九十的数据

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

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

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

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

“约束”的分类

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

 

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

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

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

也受类型约束制约。

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

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

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