数据完整性

[quote][b]更新丢失[/b]:当有两个写进程同时修改相同的数据时,往往会出现一个写进程做的修改覆盖了另一个写进程的修改。这种情况是完整性问题最常见的类型。互斥锁的设计就是防范这种问题的出现。
[b]脏读[/b]:一个事务修改的数据在提交前被另一个事务读取,就会发生脏读。由于事务提交的修改有可能会被回滚,因而其他事务读取的这个数据就可能不正确。为了避免读锁导致的竞争,许多数据库都允许脏读。
[b]不可重复读[/b]:由于其他事务的修改,可能出现不可重复的读。例如一个事务根据某个条件做查询。当这个事务得到返回结果集之后,但是在这个事务完成之前,另一个事务修改了数据,使得某些数据不再满足前一个事务的查询条件。如果这个时候前一个事务重复这一个查询操作,那么他将得到一个不同的结果集。因而针对最初的结果集所做的修改有可能就无效了。简言之,根据同样的条件在同一事务中查询两次有可能产生不同的结果。
[b]幻影读[/b]:这类型的问题也是由于其他事务对数据的修改而导致的。例如,一个事务根据某个条件做查询。在前一个事务得到返回结果集之后,但是在他完成之前,另一个事务在数据库中插入了一条数据,并且该条数据符合前一个事务的选择条件,如果事务中的第一条sql语句返回了最初满足选择条件的行,之后该事务对满足条件的这些行执行操作,这个操作所涉及到的行与之前查询到的行不同,这就因为包含了幻影行而导致的。
[/quote]

[b]1数据完整性约束的分类[/b]

1.域完整性。对表字段取值进行约束,提供了一个给定域的有效入口,包括数据类型、取值范围、格式、精度等的规定,实现域完整性可以通过“check约束”、foreign约束”、“default约束”、“not null约束”、“规则”等来实施。
2.实体完整性。以表记录为单位进行约束,规定一个表中的每一行必须是唯一的。开发者需要指定一个表中的一列或一组列作为它的主键,[color=red]表中的每行必须含有一个唯一的主键[/color]。主键首先不能为空值,其次不能与表中已有行的主键值相同。可以通过列的Identity属性、主键约束、惟一性约束等来实现。
3.参照完整性。参照完整性在关系模式中,实体与实体之间的关联同样采用关系模式来描述,通过引用对应实体的关系模式的主码来表示对应实体之间的关联。参照完整性约束又称为引用完整性约束,是指[color=red]两个表的主码和外码的数据要对应一致[/color]。可以通过“外键约束”、“触发器”、“存储过程”等来实施。
参照完整性属于表间规则。对于永久关系的相关表,在更新、插入或删除记录时,如果只改其一不改其二,就会影响数据的完整性:例如修改父表中关键字值后,子表关键字值未做相应改变;删除父表的某记录后,子表的相应记录未删除,致使这些记录称为孤立记录;对于子表插入的记录,父表中没有相应关键字值的记录;等等。对于这些设计表间数据的完整性,统称为参照完整性。
4. 用户定义完整性。以上三种数据完整性约束能够实现数据库中大部分数据完整性,但总有一些约束条件是开发者不能应用以上数据完整性约束来实行的。如入学时间不能晚于毕业时间;实现诸如此类的数据完整性保护,需要开发者自己通过创建存储过程和触发器、规则等来实现。

[b]2实施完整性的应用实例[/b]

2.1 通过“约束”实施数据的完整性。通过“约束”可实施列级和表级的数据完整性。SQL Server支持的“约束”有如下几种:非空约束NOT NULL,主键约束PRIMARY KEY、惟一约束UNIQUE、核查约束CHECK、外键约束FOREIGN KEY、默认值约束DEFAULT。“约束”的定义,可在创建表或更改表同时进行。

创建表时定义“约束”

例子1 CREATE TABLE STUDENT

(学号char(6)PRIMARY KEY,

姓名char(8)NOT NULL,

性别char(2)CHECK(性别='男'OR性别='女'),

政治面貌 char(6),

)

/*以上定义的全为列级数据完整性,定义“学号”列为主键,“姓名”列为非空值,“性别”列通过检验CHECK(性别=‘男’OR性别=‘女’)保证“性别”字段值为‘男’或‘女’。*/

CREATE TABLE SCORE

( 学号char(6),

课程名char(20),

成绩int,

补考成绩int,

CONSTRAINT PK_ID PRIMARY KEY(学号,课程名),

CONSTRAINT FK_33 FOREIGN KEY(学号)REFERENCES STUDENT(学号),

CONSTRAINT FK_35 FOREIGN KEY(课程名)REFERENCES COURSE(课程名)

)

/*以上三个“约束”全为表级约束,约束CONSTRAINT PK_ID PRIMARY KEY(学号,课程名)保证“学号 课程名”非空且惟一,约束CONSTRAINT FK_33 FOREIGN KEY(学号)REFERENCES STUDENT(学号)、CONSTRAINT FK_35 FOREIGN KEY(课程名)REFERENCES COURSE(课程名)保证该表中的“学号”和“课程名”字段值只能取STUDENT>中已存在的“学号”值和中已存在的“课程名”值。*/

2.2 通过“规则”实施数据的完整性。“规则”的作用类似于“检查约束”,若将一个“规则”绑定到指定列上,则可以检查该列的数据是否符合“规则”的要求。“规则”与“检查约束”的主要区别在于一列只能绑定一个“规则”,但却可以设置多个“检查约束”。“规则的优点是同一个规则对象可以供不同数据表的不同字段使用,但每个字段最多只能和一个规则对象结合。“使用“规则”的过程依次为:创建规则——绑定规则——解除绑定——删除规则。

例子2 CREATE RULE rule_ck

AS@成绩>=0 and@成绩<=100/*创建

名为“rule_ck”的“规则”*/

GO

sp_bindrule rule_ck,‘STUDENT.成绩’

/*将“规则rule_ck”绑定到的“成绩”字段*/

2.3 通过“默认”实施数据的完整性。与“规则“类似,“默认值”对象(简称为“默认”)也是仅创建一次就可以绑定到数据库的多个表的列或用户定义的数据类型中,使它们共享“默认”。使用“默认”的过程与使用“规则”的过程类似,依次为:创建默认--绑定默认--解除绑定--删除默认。

例子3 CREATE DEFAULT default_zz

AS'群众'/*创建名为”default_zz”的“默认”*/

GO

sp_bindefaultdefault_zz,‘STUDENT.政治面貌'

/*将默认”default_zz”绑定到的“政治面貌”字段*/

2.4 通过“触发器”实施数据的完整性。触发器属于一种特殊的存储过程,可以在其中包含复杂的SQL语句。触发器与存储过程的区别在于触发器能够自动执行并且不含有参数。通常可以在触发器内编写一段自动执行的程序,用于保证数据操作的完整性,从而扩展了对默认值、约束和规则的完整性检查。对表进行包括添加数据、删除数据、更新数据中的一种或多种操作时,触发器就会自动执行,在此不再举例说明。

本文来源于 www.14edu.com(论文网) 原文链接:http://www.14edu.com/ligong/052540AH010.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值