您现在的位置是:首页 > 开发教程

开发教程

数据库完整性子系统和完整性规则

2020-11-12 09:09:26 开发教程 admin
1,数据库的完整性指数据的正确性、有效性和相容性,防止错误的数据进入数据库。2,完整性子系统的主要功能监督事务的执行,并测试是否违反完整性规则若有违反现象,则采取恰当的操作,譬如拒绝操作、报告违反情况、改正错误等方法来处理3,完整性规则什么
1,数据库的完整性
指数据的正确性、有效性和相容性,防止错误的数据进入数据库。

2,完整性子系统的主要功能
监督事务的执行,并测试是否违反完整性规则
若有违反现象,则采取恰当的操作,譬如拒绝操作、报告违反情况、改正错误等方法来处理

3,完整性规则
什么时候使用规则进行检查(称为规则的“触发条件”)
要检查什么样的错误(称为“约束条件”或“谓词”)
如果查出错误,应该怎么办(称为“ELSE子句”,即违反时要做的动作)

SQL中的完整性约束1---域约束和断言
域约束
用“CREATEDOMAIN”语句定义新的域,并且还可出现CHECK子句

断言
如果完整性约束牵涉面较广,与多个关系有关,或者与聚合操作有关,那么SQL2提供“断言”(Assertions)机制让用户书写完整性约束
CREATEASSERTION<断言名>CHECK(<条件>)
DROPASSERTION<断言名>

定义一个新的域COLOR,可用下列语句实现:
CREATEDOMAINCOLORCHAR(6)DEFAULTˊ???ˊ
CONSTRAINTV_COLORS
CHECK(VALUEIN(ˊRedˊ,ˊYellowˊ,
ˊBlueˊ,ˊGreenˊ,ˊ???ˊ));
每位教师开设的课程不能超过10门。
CREATEASSERTIONASSE1CHECK(10>=ALL(SELECTCOUNT(C#)FROMCGROUPBYTNAME));

SQL中的完整性约束2---基本表的约束
1,候选键的定义
UNIQUE(〈列名序列〉)或PRIMARYKEY(〈列名序列〉)

2,外键的定义
FOREIGNKEY(〈列名序列〉)REFERENCES<参照表>[(<列名序列>)][ONDELETE<参照动作>][ONUPDATE<参照动作>]

3,“检查约束”的定义
CHECK(〈条件表达式〉)

关于外键约束完整性的补充
删除参照表中元组时的考虑
NOACTION
CASCADE方式
RESTRICT方式
SETNULL方式
SETDEFAULT方式

修改参照表中主键值时的考虑、
NOACTION
CASCADE方式
RESTRICT方式
SETNULL方式
SETDEFAULT方式

关于数据库完整性的例子
学生关系S(S#,SNAME,AGE,SEX,SDEPT)
选课关系SC(S#,C#,GRADE)
课程关系C(C#,CNAME,CDEPT,TNAME)

在教学数据库中,要求S中的元组满足条件:男生年龄在15~35岁之间,女生年龄在15~30岁之间。对应的语句为:
CHECK(AGE>=15AND((SEX=ˊ男ˊANDAGE<=35)OR(SEX=ˊ女ˊANDAGE<=30)))

CREATETABLESC(S#CHAR(4),C#CHAR4),GRADESMALLINT,PRIMARYKEY(S#,C#),
CHECK(S#IN(SELECTS#FROMS)),CHECK(C#IN(SELECTC#FROMC)))
①在SC中插入一个元组,若C#值在C中不存在,则系统将拒绝这个插入操作。
②在SC中插入一个元组,若S#值在S中不存在,则系统将拒绝这个插入操作。
③在S中删除一个元组,这个操作将与关系SC中的检查子句无关。若此时SC中存在被删学生的选课元组时,SC将违反检查子句中条件。

SQL3的触发器


什么是触发器
触发器的组成
事件:插入、删除、修改等操作,引发触发器的操作
条件:引发触发器的条件
动作:引发触发器后的工作

触发器的命名规则:
动作时间触发事件目标表名

下面是应用于选课关系SC的一个触发器。这个触发器规定,在修改关系SC的成绩值时,要求修改后的成绩一定不能比原来的低,否则就拒绝修改
CREATETRIGGERTRIG1AFTERUPDATEOFGRADEONSC
REFERENCING
OLDASOLDTUPLE
NEWASNEWTUPLE
FOREACHROW
WHEN(OLDTUPLE.GRADE>NEWTUPLE.GRADE)

UPDATESCSETGRADE=OLDTUPLE.GRADE
WHEREC#=NEWTUPLE.C#