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

MSSQL
SQLSERVER 中datetime 和 smalldatetime类型分析说明
数据库清除日志文件(LDF文件过大)
按日期选择最晚日期与最早日期对应的数的差值
sql 时间函数 整理的比较全了
SQL Server全文检索查询浅析
SQL 存储过程基础语法之一
SQL Substring提取部分字符串
用户"sa"登陆失败 SQLServer 错误18456的解决方法
MSSQL 检查所使用的语句是否符合标准
drop,truncate与delete的区别
SQL语句查询数据库中重复记录的个数
SQL 导入导出Excel数据的语句
可以获取客户端的IP地址的sql语句
SQL 根据汉字获取全拼的代码
sqlserver exists,not exists的用法
sqlserver substring函数使用方法小结
sql 判断数据库,表,存储过程等是否存在的代码
做购物车系统时利用到得几个sqlserver 存储过程
Sql2000数据库的备份文件恢复到Sql2005的方法
sql 分组查询问题

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


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

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

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

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

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

“约束”的分类

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

 

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

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

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

也受类型约束制约。

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

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

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