APP下载

ORACLE数据库完整性约束浅析

2016-10-18陈燕群王海燕

电脑知识与技术 2016年21期

陈燕群+王海燕

摘要:随着计算机技术的高速发展以及软件技术的跨越式前进,使数据库技术成为了当今信息化时代中不可或缺的重要组成部分,而当下流行的关系数据库成为了主流,而ORACLE数据库就是目前企事业、机关单位等开发信息管理系统所使用的大型关系数据库,为了使数据库不会遭到无意或有意的破坏,其中数据库中的完整性约束就变得非常重要,该文详细探讨了ORACLE中的完整性约束以及实现的方法。

关键词:ORACLE;数据库;完整性约束

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2016)21-0001-02

ORACLE数据库的完整性是指在数据库中的数据的一致性和准确性,是为了解决不合规范的操作使错误数据被录入到数据库中,约束其实就是指对其本身数据库结构进行一个完整性的定义,以此保证录入的数据符合我们定义的一些条件或设定的约定等,从而防止数据受到破坏,保证数据的合法性。完整性约束是ORACLE数据库安全的一个重要因素,只有制定的相应的完整性约束,才能使数据库中的数据安全合法。在ORACLE数据库中,完整性约束是一种约定,不会占用数据库存储空间。它只是存在于数据字典中,当启用完整性约束后,在执行SQL语句时,就会检查约束,从而增强数据的完整性。

ORACLE数据库的完整性约束包括了实体完整性、域完整性、参照完整性、和用户自定义完整性,下面就分别介绍一下这些完整性约束的作用及使用方法。

1 实体完整性约束

实体完整性约束主要是指主键约束(PRIMARY KEY),是指在ORACLE数据库的表中定义一个主键值,这个值是唯一的,用来确定每一行数据的标识符。在所有的约束类型中,它是最重要的一种约束类型,也是使用最广泛的。主键约束能够保证数据表的完整性和唯一性。在一个表中只能创建一个主键,且主键的值为唯一而且非空值。我们在设计数据表的时候虽然只能创建一个主键约束,但是可以使用两个或者两个以上的字段联合在一起作为唯一标识的主键,这种情况就叫做联合主键(COMPOSITE PRIMARY KEY)。主键约束可与NOT NULL非空约束一起作用于每一行数据来保证主键唯一标识每一行,主键采用B-TREE索引算法。

创建主键约束可以使用CREATE TABLE建表语句来创建,也可以单独使用ALTER TABLE语句来创建。如下是一个图书管理系统的数据库中图书基本信息表bookinfo,其中包括book_no(编号)、book_name(图书名称)、book_publisher(出版社)、book_total(库存数量)、book_author(作者)字段,下面所示把book_no作为此表的主键,就是说每一条数据的图书编号不能为空而且不能重复:

CREATE TABLE bookinfo

(book_no NUMBER CONSTRAINT pk_books PRIMARY KEY,

book_name VARCHAR2(50),

book_publisher VARCHAR2(80),

book_total NUMBER (4),

book_author VARCHAR2(30),

);

如果要删除此主键约束,可以使用ALTER TABLE bookinfo DROP PRIMARY KEY语句。

2 域完整性约束

域完整性约束主要是保证表中数据的合理性,主要包括DEFAULT默认、CHECK检查、NOT NULL不为空、UNIQUE唯一约束。这些约束主要是使用一定的规则,用来限制表中指定列的合理取值。

2.1 DEFAULT约束

它是指列的默认定义值,是用来限制指定列的默认值。它的默认值可以包括很多,如常量、字符串、函数或NULL值等。如下所示:

定义字符串型的常量:DEFAULT ORACLE入门;

定义数值型的常量:DEFAULT 50;

定义函数:DEFAULT SYSDATE();

定义空值:DEFAULT NULL

2.2 CHECK约束

它是用来限制用户录入到表中某列的数据,即在该列中只能录入限制范围内的数据,以此来限制输入到一列或多列中的可能值的完整性约束。它和外键的约束类似,但是它是通过指定的逻辑表达式来限制取值范围。CHECK约束能够保证数据的一致性。单一的数据列可以有多个CHECK约束保护,一个CHECK约束可以保护多个数据列。创建表的CHECK约束的语法如下所示:

CONSTRAINT check_bookinfo_book_total CHECK (book_total BETWEEN 0 AND 200) ;对上例中图书信息表中的图书数量限制在200本以内

ALTER TABLE bookinfo ENABLE CONSTRAINT check_bookinfo_book_total ;启用图书数量约束

2.3 NOT NULL不为空约束

它是用来确定数据表的列中是否允许空值,如果启用,将使表中的此列的所有数据行都有值,即它应用于单独的一列,并保证该必须要有数据。默认情况下,ORACLE允许任何一列都可以有NULL值。如果要启用非空约束,可以如下所示来使用:

book_total NUMBER(4) not null, --此处限制图书的数量不能为空,当插入数据时数量必须输入一个数值。

2.4 UNIQUE唯一约束

它是指定数据表中的某一列或多列不能有相同的两行或两行以上的数据同时存在,只能取唯一的值。这咱约束通过实现唯一性索引来强制实体的完整性。如果在一个数据表中已经有一个主键约束时,想在其他列上实现实体的完整性,而一个表中不能有两个或多个主键约束,在这种情况下就只能通过创建UNIQUE唯一约束来实现。因为一个表中可以同时有多个UNIQUE唯一约束。使用唯一约束可以保护表中的多个数据列,使数据列中任何两行的数据都不相同。唯一性约束和主键的区别在于可以有多列组成,而且其中部分列还可以为空值。下面是创建唯一性约束的语法:

CONSTRAINT constraint_bookinfo_u1 UNIQUE (book_name,book_publisher) --定义了两个字段复合唯一性约束

ALTER TABLE bookinfo ENABLE CONSTRAINT constraint_bookinfo_u1;启用定义的唯一性约束

3 参照完整性约束

它是指对两个关系建立联系的主外键的约束(FOREIGN KEY),也叫外键约束。它是在外键上定义一种数据完整性的规则,用来实现两个表之间的依赖关系。两个表一个是父表,一个是子表。外键的取值是受父表中主键或唯一值的约束,不能够取其他值,但是外键约束只能对同一个服务器中的数据库的表起作用。定义外键约束需要父表和子表,我们在图书管理系统中再创建一个图书详细内容的子表并创建外键,如下所示:

CREATE TABLE bookdetail

(book_id NUMBER CONSTRAINT pk_bookdetail PRIMARY KEY,

book_no NUMBER,

book_name VARCHAR2(50),

book_catalog NVARCHAR2(1500),

book_buydate DATE,

book_price NUMBER(3,2),

book_isbn VARCHAR2(28)

CONSTRAIN fk_bookdetail FROEIGN KEY (book_no,book_name)

REFERENCES bookinfo (book_no,book_name)

ON DELETE SET NULL

);

ON DELETE子串告诉ORACLE如果父纪录(parent record)被删除后,子记录做什么。缺省情况下禁止在子记录还存在的情况下删除父纪录。

4 用户自定义完整性约束

是指除以上的各种约束外,还可以使用触发器来编写约束。触发器与存储过程与函数都不相同,它通过一个事件来启动。就是说当某个事件发生时,触发器将自动运行。ORACLE中的事件是指对数据库中的表时行插入、更新、修改、删除等操作时进行触发,所以触发器通常用来完成由数据库中完整性约束难以完成的复杂业务规则的约束,或用来监视对数据库的各种操作,实现审计功能,保证数据库的完整性。由于触发器比较复杂,这里不做详细探讨,只举个例子来说明触发器编写的约束,我们希望当删除bookdetail子表中图书的信息时自动删除主表中相同图书的信息,如下所示:

CREATE OR REPLACE TRIGGER bookdetail_delete

BEFORE DELETE

ON bookdetail

FOR EACH ROW

BEGIN

delete from bookinfo where book_no=:old.book_no;

END;

5 结束语

通过以上的学习,我们就可以很好地理解ORACLE中完整性约束的相关内容,在设计ORACLE数据库中的表时能够使数据更安全和完整,增强了数据的自我保护能力。

参考文献:

[1] 王霆. ORACLE数据库系统可靠性研究[D]. 上海: 上海交通大学, 2011.

[2] 王欣, 王宁. 基于触发器的oracle监控系统的设计与实现[J]. 无锡职业技术学院学报, 2009(6).

[3] 覃萍. Oracle数据库应用中安全问题分析[J]. 硅谷, 2011(19).