文档介绍:Oracle 数据库的完整性约束机制
Oracle利用完整性约束机制防止无效的数据进入数据库的基表,如果任何DML执行结果破坏完整性约束,该语句被回滚并返回一上个错误。Oracle实现的完整性约束完全遵守ANSI -1989和ISO9075-1989标准。
利用完整性约束实施数据完整性规则有下列优点:
◆定义或更改表时,不需要程序设计,便很容易地编写程序并可消除程序性错误,其功能是由Oracle控制。所以说明性完整性约束优于应用代码和数据库触发器。
◆对表所定义的完整性约束是存储在数据字典中,所以由任何应用进入的数据都必须遵守与表相关联的完整性约束。
◆具有最大的开发能力。当由完整性约束所实施的事务规则改变时,管理员只需改变完整性约束的定义,所有应用自动地遵守所修改的约束。
◆由于完整性约束存储在数据字典中,数据库应用可利用这些信息,在SQL语句执行之前或由Oracle检查之前,就可立即反馈信息。
◆由于完整性约束说明的语义是清楚地定义,对于每一指定说明规则可实现性能优化。
◆由于完整性约束可临时地使不能,以致在装入大量数据时可避免约束检索的开销。当数据库装入完成时,完整性约束可容易地使其能,任何破坏完整性约束的任何新行在例外表中列出。
Oracle的DBA和应用开始者对列的值输入可使用的完整性约束有下列类型:
◆NOT NULL约束:如果在表的一列的值不允许为空,则需在该列指定NOT NULL约束。
◆UNIQUE码约束:在表指定的列或组列上不允许两行是具有重复值时,则需要该列或组列上指定UNIQUE码完整性约束。在UNIQUE码约束定义中的列或组列称为唯一码。所有唯一完整性约束是用索引方法实施。
◆PRIMARY KEY约束:在数据库中每一个表可有一个PRIMARY KEY约束。包含在PRIMARY KEY完整性约束的列或组列称为主码,每个表可有一个主码。Oracle使用索引实施PRIMARY KEY约束。
◆FOREIGN KEY约束(可称引用约束):在关系数据库中表可通过公共列相关联,该规则控制必须维护的列之间的关系。包含在引用完整性约束定义的列或组列称为外来码。由外来码所引用的表中的唯一码或方码,称为引用码。包含有外来码的表称为子表或从属表。由子表的外来码所引用的表称为双亲表或引用表。如果对表的每一行,其外来码的值必须与主码中一值相匹配,则需指定引用完整性约束。
◆CHECK约束:表的每行对一指定的条件必须是TRUE或未知,则需在一列或列组上指定CHECK完整性约束。如果在发出一个DML语句时,CHECK约束的条件计算得FALSE时,该语句被回滚。
一、数据完整性的类型
关系模型的三类完整性是实体完整性、参照完整性和用户完整性。
实体完整性和参照完整性是关系模型必须满足的完整性约束条件,应由关系系统自动支持。
1、实体完整性(entity integrity)
实体完整性是基于主码的,一个主码由一个或多个属性组成。实体完整性要求主码中的任一属性(列)不能为空,所谓空值是“不知道”或“无意义”的值。之所以要保证实体完整性主要是因为:在关系中,每一个元组的区分是依据主码值的不同,若主码值取空值,则不能标明该元组的存在。
2、参照完整性(referential integrity)
参照完整性是基于外码的,若基本关系R中含有与另一基本关系S的主码PK相对应的属性组FK(FK称为R的外码),则参照完整性要求,对R中的每个元组在FK上的值必须是S中某个元组的PK值,或者为空值。
参照完整性的合理性在于:R中的外码只能对S中主码的引用,,选课表中的学号是外码,它是学生表的主键,若选课表中出现了某个学生表中没有的学号,即某个学生还没有注册,却已有了选课记录,这显然是不合理的。
3、用户定义的完整性(user-defined integrity)
实体完整性和参照完整性适用于任何关系数据库系统。除此之外,不同的关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束条件。用户定义的完整性就是针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。如:学生的成绩一般情况下的取值范围在0-100之间。
二、Oracle的数据完整性的实现
1、Oracle中的实体完整性
实体完整性规则要求主属性非空。Oracle在CREATE TABLE语句中提供了PRIMARY KEY子句,供用户在建表时指定关系的主码列。例如:在学生选课数据库中,要定义Student表的sno属性为主码,可使用如下语句:
SQL>CREATE TABLE Student
( s