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