陳燕群+王海燕
摘要:隨著計算機技術的高速發(fā)展以及軟件技術的跨越式前進,使數(shù)據(jù)庫技術成為了當今信息化時代中不可或缺的重要組成部分,而當下流行的關系數(shù)據(jù)庫成為了主流,而ORACLE數(shù)據(jù)庫就是目前企事業(yè)、機關單位等開發(fā)信息管理系統(tǒng)所使用的大型關系數(shù)據(jù)庫,為了使數(shù)據(jù)庫不會遭到無意或有意的破壞,其中數(shù)據(jù)庫中的完整性約束就變得非常重要,該文詳細探討了ORACLE中的完整性約束以及實現(xiàn)的方法。
關鍵詞:ORACLE;數(shù)據(jù)庫;完整性約束
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2016)21-0001-02
ORACLE數(shù)據(jù)庫的完整性是指在數(shù)據(jù)庫中的數(shù)據(jù)的一致性和準確性,是為了解決不合規(guī)范的操作使錯誤數(shù)據(jù)被錄入到數(shù)據(jù)庫中,約束其實就是指對其本身數(shù)據(jù)庫結構進行一個完整性的定義,以此保證錄入的數(shù)據(jù)符合我們定義的一些條件或設定的約定等,從而防止數(shù)據(jù)受到破壞,保證數(shù)據(jù)的合法性。完整性約束是ORACLE數(shù)據(jù)庫安全的一個重要因素,只有制定的相應的完整性約束,才能使數(shù)據(jù)庫中的數(shù)據(jù)安全合法。在ORACLE數(shù)據(jù)庫中,完整性約束是一種約定,不會占用數(shù)據(jù)庫存儲空間。它只是存在于數(shù)據(jù)字典中,當啟用完整性約束后,在執(zhí)行SQL語句時,就會檢查約束,從而增強數(shù)據(jù)的完整性。
ORACLE數(shù)據(jù)庫的完整性約束包括了實體完整性、域完整性、參照完整性、和用戶自定義完整性,下面就分別介紹一下這些完整性約束的作用及使用方法。
1 實體完整性約束
實體完整性約束主要是指主鍵約束(PRIMARY KEY),是指在ORACLE數(shù)據(jù)庫的表中定義一個主鍵值,這個值是唯一的,用來確定每一行數(shù)據(jù)的標識符。在所有的約束類型中,它是最重要的一種約束類型,也是使用最廣泛的。主鍵約束能夠保證數(shù)據(jù)表的完整性和唯一性。在一個表中只能創(chuàng)建一個主鍵,且主鍵的值為唯一而且非空值。我們在設計數(shù)據(jù)表的時候雖然只能創(chuàng)建一個主鍵約束,但是可以使用兩個或者兩個以上的字段聯(lián)合在一起作為唯一標識的主鍵,這種情況就叫做聯(lián)合主鍵(COMPOSITE PRIMARY KEY)。主鍵約束可與NOT NULL非空約束一起作用于每一行數(shù)據(jù)來保證主鍵唯一標識每一行,主鍵采用B-TREE索引算法。
創(chuàng)建主鍵約束可以使用CREATE TABLE建表語句來創(chuàng)建,也可以單獨使用ALTER TABLE語句來創(chuàng)建。如下是一個圖書管理系統(tǒng)的數(shù)據(jù)庫中圖書基本信息表bookinfo,其中包括book_no(編號)、book_name(圖書名稱)、book_publisher(出版社)、book_total(庫存數(shù)量)、book_author(作者)字段,下面所示把book_no作為此表的主鍵,就是說每一條數(shù)據(jù)的圖書編號不能為空而且不能重復:
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 域完整性約束
域完整性約束主要是保證表中數(shù)據(jù)的合理性,主要包括DEFAULT默認、CHECK檢查、NOT NULL不為空、UNIQUE唯一約束。這些約束主要是使用一定的規(guī)則,用來限制表中指定列的合理取值。
2.1 DEFAULT約束
它是指列的默認定義值,是用來限制指定列的默認值。它的默認值可以包括很多,如常量、字符串、函數(shù)或NULL值等。如下所示:
定義字符串型的常量:DEFAULT ORACLE入門;
定義數(shù)值型的常量:DEFAULT 50;
定義函數(shù):DEFAULT SYSDATE();
定義空值:DEFAULT NULL
2.2 CHECK約束
它是用來限制用戶錄入到表中某列的數(shù)據(jù),即在該列中只能錄入限制范圍內(nèi)的數(shù)據(jù),以此來限制輸入到一列或多列中的可能值的完整性約束。它和外鍵的約束類似,但是它是通過指定的邏輯表達式來限制取值范圍。CHECK約束能夠保證數(shù)據(jù)的一致性。單一的數(shù)據(jù)列可以有多個CHECK約束保護,一個CHECK約束可以保護多個數(shù)據(jù)列。創(chuàng)建表的CHECK約束的語法如下所示:
CONSTRAINT check_bookinfo_book_total CHECK (book_total BETWEEN 0 AND 200) ;對上例中圖書信息表中的圖書數(shù)量限制在200本以內(nèi)
ALTER TABLE bookinfo ENABLE CONSTRAINT check_bookinfo_book_total ;啟用圖書數(shù)量約束
2.3 NOT NULL不為空約束
它是用來確定數(shù)據(jù)表的列中是否允許空值,如果啟用,將使表中的此列的所有數(shù)據(jù)行都有值,即它應用于單獨的一列,并保證該必須要有數(shù)據(jù)。默認情況下,ORACLE允許任何一列都可以有NULL值。如果要啟用非空約束,可以如下所示來使用:
book_total NUMBER(4) not null, --此處限制圖書的數(shù)量不能為空,當插入數(shù)據(jù)時數(shù)量必須輸入一個數(shù)值。
2.4 UNIQUE唯一約束
它是指定數(shù)據(jù)表中的某一列或多列不能有相同的兩行或兩行以上的數(shù)據(jù)同時存在,只能取唯一的值。這咱約束通過實現(xiàn)唯一性索引來強制實體的完整性。如果在一個數(shù)據(jù)表中已經(jīng)有一個主鍵約束時,想在其他列上實現(xiàn)實體的完整性,而一個表中不能有兩個或多個主鍵約束,在這種情況下就只能通過創(chuàng)建UNIQUE唯一約束來實現(xiàn)。因為一個表中可以同時有多個UNIQUE唯一約束。使用唯一約束可以保護表中的多個數(shù)據(jù)列,使數(shù)據(jù)列中任何兩行的數(shù)據(jù)都不相同。唯一性約束和主鍵的區(qū)別在于可以有多列組成,而且其中部分列還可以為空值。下面是創(chuàng)建唯一性約束的語法:
CONSTRAINT constraint_bookinfo_u1 UNIQUE (book_name,book_publisher) --定義了兩個字段復合唯一性約束
ALTER TABLE bookinfo ENABLE CONSTRAINT constraint_bookinfo_u1;啟用定義的唯一性約束
3 參照完整性約束
它是指對兩個關系建立聯(lián)系的主外鍵的約束(FOREIGN KEY),也叫外鍵約束。它是在外鍵上定義一種數(shù)據(jù)完整性的規(guī)則,用來實現(xiàn)兩個表之間的依賴關系。兩個表一個是父表,一個是子表。外鍵的取值是受父表中主鍵或唯一值的約束,不能夠取其他值,但是外鍵約束只能對同一個服務器中的數(shù)據(jù)庫的表起作用。定義外鍵約束需要父表和子表,我們在圖書管理系統(tǒng)中再創(chuàng)建一個圖書詳細內(nèi)容的子表并創(chuàng)建外鍵,如下所示:
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 用戶自定義完整性約束
是指除以上的各種約束外,還可以使用觸發(fā)器來編寫約束。觸發(fā)器與存儲過程與函數(shù)都不相同,它通過一個事件來啟動。就是說當某個事件發(fā)生時,觸發(fā)器將自動運行。ORACLE中的事件是指對數(shù)據(jù)庫中的表時行插入、更新、修改、刪除等操作時進行觸發(fā),所以觸發(fā)器通常用來完成由數(shù)據(jù)庫中完整性約束難以完成的復雜業(yè)務規(guī)則的約束,或用來監(jiān)視對數(shù)據(jù)庫的各種操作,實現(xiàn)審計功能,保證數(shù)據(jù)庫的完整性。由于觸發(fā)器比較復雜,這里不做詳細探討,只舉個例子來說明觸發(fā)器編寫的約束,我們希望當刪除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中完整性約束的相關內(nèi)容,在設計ORACLE數(shù)據(jù)庫中的表時能夠使數(shù)據(jù)更安全和完整,增強了數(shù)據(jù)的自我保護能力。
參考文獻:
[1] 王霆. ORACLE數(shù)據(jù)庫系統(tǒng)可靠性研究[D]. 上海: 上海交通大學, 2011.
[2] 王欣, 王寧. 基于觸發(fā)器的oracle監(jiān)控系統(tǒng)的設計與實現(xiàn)[J]. 無錫職業(yè)技術學院學報, 2009(6).
[3] 覃萍. Oracle數(shù)據(jù)庫應用中安全問題分析[J]. 硅谷, 2011(19).