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

MSSQL
无数据库日志文件恢复数据库方法两则(一)
SQLServer编写存储过程小工具(一)
SQLServer编写存储过程小工具(二)
SQLServer编写存储过程小工具(三)
Eclipse+JBoss+MySQL开发环境设置
MYSQL使用简述
一些有用的sql语句实例
枚举SQLServer的实例
SQLServer应用程序中的高级SQL注入
SQL Server数据库超级管理员账号防护知识
讲解如何实现互联网上数据库的安全
SQL 2005数据库转到SQL 2000的步骤讲解
带你轻松接触数据库生成xml的两个方法
用MS SQL Reporting Services生成报表
保护SQL Server的十个步骤
关于SQL SERVER的一些安全问题
SQL Server 2008数据库中使用表值参数
SQL Server 2005中用存储过程实现搜索功能
MS SQL数据库置疑解决办法
SQL Server密码管理的六个危险判断

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


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

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

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

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

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

“约束”的分类

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

 

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

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

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

也受类型约束制约。

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

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

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