oracle教程第9章數(shù)據(jù)性_第1頁(yè)
oracle教程第9章數(shù)據(jù)性_第2頁(yè)
oracle教程第9章數(shù)據(jù)性_第3頁(yè)
oracle教程第9章數(shù)據(jù)性_第4頁(yè)
oracle教程第9章數(shù)據(jù)性_第5頁(yè)
已閱讀5頁(yè),還剩41頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Oracle 數(shù)據(jù)庫(kù)教程1第9章 數(shù)據(jù)完整性本章要點(diǎn) 數(shù)據(jù)完整性概述 域完整性 實(shí)體完整性 參照完整性 Oracle 數(shù)據(jù)庫(kù)教程29.1 數(shù)據(jù)完整性概述數(shù)據(jù)完整性規(guī)則通過(guò)約束來(lái)實(shí)現(xiàn),約束是在表上強(qiáng)制執(zhí)行的一些數(shù)據(jù)校驗(yàn)規(guī)則,在插入、修改或者刪除數(shù)據(jù)時(shí)必須符合在相關(guān)字段上設(shè)置的這些規(guī)則,否則報(bào)錯(cuò)。Oracle使用完整性約束機(jī)制以防止無(wú)效的數(shù)據(jù)進(jìn)入數(shù)據(jù)庫(kù)的基表,如果一個(gè)DML語(yǔ)句執(zhí)行結(jié)果破壞完整性約束,就會(huì)回滾語(yǔ)句并返回一個(gè)錯(cuò)誤。通過(guò)完整性約束實(shí)現(xiàn)數(shù)據(jù)完整性規(guī)則有以下優(yōu)點(diǎn): 完整性規(guī)則定義在表上,存儲(chǔ)在數(shù)據(jù)字典中,應(yīng)用程序的任何數(shù)據(jù)都必須遵守表的完整性約束。 當(dāng)定義或修改完整性約束時(shí),不需要額外編程

2、。 用戶可指定完整性約束是啟用或禁用。 Oracle 數(shù)據(jù)庫(kù)教程39.1 數(shù)據(jù)完整性概述 當(dāng)由完整性約束所實(shí)施的事務(wù)規(guī)則改變時(shí),只需改變完整性約束的定義,所有應(yīng)用自動(dòng)地遵守所修改的約束。數(shù)據(jù)完整性一般包括域完整性、實(shí)體完整性、參照完整性,用戶定義完整性,下面分別進(jìn)行介紹。1域完整性域完整性指列數(shù)據(jù)輸入的有效性,又稱列完整性,通過(guò)CHECK約束、DEFALUT約束、NOT NULL約束、數(shù)據(jù)類型和規(guī)則等實(shí)現(xiàn)域完整性。CHECK約束通過(guò)顯示輸入到列中的值來(lái)實(shí)現(xiàn)域完整性,例如:對(duì)于stsys數(shù)據(jù)庫(kù)score表,grade規(guī)定為0分到100分之間,可用CHECK約束表示。 Oracle 數(shù)據(jù)庫(kù)教程49

3、.1 數(shù)據(jù)完整性概述2實(shí)體完整性實(shí)體完整性要求表中有一個(gè)主鍵,其值不能為空且能唯一地標(biāo)識(shí)對(duì)應(yīng)的記錄,又稱為行完整性,通過(guò)PRIMARY KEY約束、UNIQUE約束、索引或 IDENTITY 屬性等實(shí)現(xiàn)數(shù)據(jù)的實(shí)體完整性。例如,對(duì)于stsys數(shù)據(jù)庫(kù)中student表,sno列作為主鍵,每一個(gè)學(xué)生的sno列能唯一地標(biāo)識(shí)該學(xué)生對(duì)應(yīng)的行記錄信息,通過(guò)sno列建立主鍵約束實(shí)現(xiàn)student表的實(shí)體完整性。3參照完整性參照完整性保證主表中的數(shù)據(jù)與從表中數(shù)據(jù)的一致性,又稱為引用完整性,參照完整性確保鍵值在所有表中一致,通過(guò)定義主鍵(PRIMARY KEY)與外鍵(FOREIGN KEY)之間的對(duì)應(yīng)關(guān)系實(shí)現(xiàn)參

4、照完整性。 Oracle 數(shù)據(jù)庫(kù)教程59.1 數(shù)據(jù)完整性概述主鍵(PRIMARY KEY):表中能唯一標(biāo)識(shí)每個(gè)數(shù)據(jù)行的一個(gè)或多個(gè)列。外鍵(FOREIGN KEY):一個(gè)表中的一個(gè)或多個(gè)列的組合是另一個(gè)表的主鍵。例如,將student表作為主表,表中的sno列作為主鍵,score表作為從表,表中的sno列作為外鍵,從而建立主表與從表之間的聯(lián)系實(shí)現(xiàn)參照完整性,student表和score表的對(duì)應(yīng)關(guān)系如表9.1、和表9.2所示。 Oracle 數(shù)據(jù)庫(kù)教程69.1 數(shù)據(jù)完整性概述 Oracle 數(shù)據(jù)庫(kù)教程79.1 數(shù)據(jù)完整性概述如果定義了兩個(gè)表之間的參照完整性,則要求: 從表不能引用不存在的鍵值。 如

5、果主表中的鍵值更改了,那么在整個(gè)數(shù)據(jù)庫(kù)中,對(duì)從表中該鍵值的所有引用要進(jìn)行一致的更改。 如果要?jiǎng)h除主表中的某一記錄,應(yīng)先刪除從表中與該記錄匹配的相關(guān)記錄。總括起來(lái), Oracle數(shù)據(jù)庫(kù)中的數(shù)據(jù)完整性包括域完整性、實(shí)體完整性、參照完整性,和實(shí)現(xiàn)上述完整性的約束,其中: CHECK約束,檢查約束,實(shí)現(xiàn)域完整性。 NOT NULL約束,非空約束,實(shí)現(xiàn)域完整性。 PRIMARY KEY約束,主鍵約束,實(shí)現(xiàn)實(shí)體完整性。 UNIQUE KEY約束,唯一性約束,實(shí)現(xiàn)實(shí)體完整性。 FOREIGN KEY約束,外鍵約束,實(shí)現(xiàn)參照完整性。 Oracle 數(shù)據(jù)庫(kù)教程89.2 域完整性域完整性通過(guò)CHECK約束實(shí)現(xiàn),C

6、HECK約束對(duì)輸入列或整個(gè)表中的值設(shè)置檢查條件,以限制輸入值,保證數(shù)據(jù)庫(kù)的數(shù)據(jù)完整性,下面介紹通過(guò)CHECK約束實(shí)現(xiàn)域完整性。 Oracle 數(shù)據(jù)庫(kù)教程99.2.1 使用SQL Developer 實(shí)現(xiàn)域完整性1使用SQL Developer創(chuàng)建CHECK約束【例9.1】使用SQL Developer,在stsys數(shù)據(jù)庫(kù)student表的ssex列,創(chuàng)建一個(gè)性別為男或女的CHECK約束CK_ssex。(1)啟動(dòng)”SQL Developer”,在”連接”節(jié)點(diǎn)下打開(kāi)數(shù)據(jù)庫(kù)連接”sys_stsys”,展開(kāi)“表”節(jié)點(diǎn),選中表“student”,單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇”約束條件”“添加檢查

7、”命令,出現(xiàn)如圖9.1所示的“添加檢查”窗口中,在“約束條件名稱”欄輸入約束名稱CK_ssex,在“檢查條件”欄輸入相應(yīng)的CHECK約束表達(dá)式為ssex in (男, 女)。 Oracle 數(shù)據(jù)庫(kù)教程10(2)單擊“應(yīng)用”按鈕,完成“CHECK約束”的創(chuàng)建。2使用SQL Developer修改或刪除CHECK約束【例9.2】使用SQL Developer,修改或刪除創(chuàng)建的CHECK約束CK_ssex。(1)啟動(dòng)”SQL Developer”,在”連接”節(jié)點(diǎn)下打開(kāi)數(shù)據(jù)庫(kù)連接”sys_stsys”,展開(kāi)“表”節(jié)點(diǎn),選中表“student”,單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇”編輯”命令,出現(xiàn)“編

8、輯表”窗口,如圖9.2所示。(2)在“編輯表”窗口中,單擊“添加”按鈕,可以添加一個(gè)檢查約束;單擊“刪除”按鈕,可以刪除一個(gè)檢查約束;在選擇一個(gè)檢查約束后,可在“名稱”欄中修改名稱,在“條件”欄修改相應(yīng)的檢查約束表達(dá)式。 9.2.1 使用SQL Developer 實(shí)現(xiàn)域完整性O(shè)racle 數(shù)據(jù)庫(kù)教程11(3)單擊“確定”按鈕,完成上述“CHECK約束”的添加、刪除或修改。 9.2.1 使用SQL Developer 實(shí)現(xiàn)域完整性O(shè)racle 數(shù)據(jù)庫(kù)教程129.2.2 使用PL/SQL語(yǔ)句實(shí)現(xiàn)域完整性1. 使用PL/SQL語(yǔ)句在創(chuàng)建表時(shí)創(chuàng)建CHECK約束使用PL/SQL語(yǔ)句在創(chuàng)建表時(shí)創(chuàng)建CHE

9、CK約束有作為列的約束或作為表的約束兩種方式。語(yǔ)法格式:CREATE TABLE ( DEFAULT NOT NULL | NULL CONSTRAINT CHECK() /*定義為列的約束*/ ,n CONSTRAINT CHECK() /*定義為表的約束*/)其中,CONSTRAINT關(guān)鍵字為CHECK約束定義名稱,CHECK約束表達(dá)式為邏輯表達(dá)式。 Oracle 數(shù)據(jù)庫(kù)教程139.2.2 使用PL/SQL語(yǔ)句實(shí)現(xiàn)域完整性【例9.3】在stsys數(shù)據(jù)庫(kù)中創(chuàng)建表goods2,包含以下域完整性定義CREATE TABLE goods2 ( gid char(6) NOT NULL PRIMAR

10、Y KEY, /*商品號(hào)*/ gname char(20) NOT NULL, /*商品名*/ gclass char(6) NOT NULL, /*類型*/ price number NOT NULL CHECK(price=8000), /*價(jià)格*/ tradeprice number NOT NULL, /*批發(fā)價(jià)格*/ stockqt number NOT NULL, /*庫(kù)存量*/ orderqt number NULL /*訂貨尚未到貨商品數(shù)量*/);在上述語(yǔ)句中,定義goods2表price列的CHECK約束表達(dá)式為CHECK(price=8000),即價(jià)格小于或等于8000。

11、Oracle 數(shù)據(jù)庫(kù)教程14【例9.4】在表goods2中,插入記錄1005,DELL Inspiron 15R,10,9899,14,7。INSERT INTO goods2 VALUES(1005,DELL Inspiron 15R,10,9899,6930,14,7);在goods2表price列,由于插入記錄中的價(jià)格大于8000,違反CHECK約束,系統(tǒng)報(bào)錯(cuò),拒絕插入。2. 使用PL/SQL語(yǔ)句在修改表時(shí)創(chuàng)建CHECK約束語(yǔ)法格式:ALTER TABLE ADD( CONSTRAINT CHECK() 9.2.2 使用PL/SQL語(yǔ)句實(shí)現(xiàn)域完整性O(shè)racle 數(shù)據(jù)庫(kù)教程15【例9.5】

12、通過(guò)修改goods2表,增加批發(fā)價(jià)格列的CHECK約束。ALTER TABLE goods2 ADD CONSTRAINT CK_tradeprice CHECK(tradeprice=6000);3. 使用PL/SQL語(yǔ)句刪除CHECK約束語(yǔ)法格式:ALTER TABLE DROP CONSTRAINT 【例9.6】刪除stsc數(shù)據(jù)庫(kù)的goods2表批發(fā)價(jià)格列的CHECK約束。ALTER TABLE goods2 DROP CONSTRAINT CK_tradeprice; 9.2.2 使用PL/SQL語(yǔ)句實(shí)現(xiàn)域完整性O(shè)racle 數(shù)據(jù)庫(kù)教程169.3 實(shí)體完整性實(shí)體完整性通過(guò)PRIMARY

13、 KEY約束、UNIQUE約束等實(shí)現(xiàn)。通過(guò)PRIMARY KEY約束定義主鍵,一個(gè)表只能有一個(gè)PRIMARY KEY約束,且PRIMARY KEY約束不能取空值,Oracle為主鍵自動(dòng)創(chuàng)建唯一性索引,實(shí)現(xiàn)數(shù)據(jù)的唯一性。通過(guò)UNIQUE約束定義唯一性約束,為了保證一個(gè)表非主鍵列不輸入重復(fù)值,應(yīng)在該列定義UNIQUE約束。PRIMARY KEY約束與UNIQUE約束主要區(qū)別如下: 一個(gè)表只能創(chuàng)建一個(gè)PRIMARY KEY約束,但可創(chuàng)建多個(gè)UNIQUE約束。 PRIMARY KEY約束的列值不允許為NULL,UNIQUE約束的列值可取NULL。創(chuàng)建PRIMARY KEY約束時(shí),系統(tǒng)自動(dòng)創(chuàng)建聚集索引,

14、創(chuàng)建UNIQUE約束時(shí),系統(tǒng)自動(dòng)創(chuàng)建非聚集索引。PRIMARY KEY約束與UNIQUE約束都不允許對(duì)應(yīng)列存在重復(fù)值 Oracle 數(shù)據(jù)庫(kù)教程179.3.1 使用SQL Developer 實(shí)現(xiàn)實(shí)體完整性 1. 使用SQL Developer創(chuàng)建和刪除PRIMARY KEY約束使用SQL Developer創(chuàng)建和刪除PRIMARY KEY約束參看4.3.1節(jié)相關(guān)操作步驟。2. 使用SQL Developer創(chuàng)建和刪除UNIQUE約束使用SQL Developer創(chuàng)建與刪除UNIQUE約束舉例如下:【例9.7】 使用SQL Developer,在course表的課程名列,創(chuàng)建和刪除UNIQUE約

15、束。(1)啟動(dòng)”SQL Developer”,展開(kāi)“表”節(jié)點(diǎn),選中表“student”,單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇”編輯”命令,出現(xiàn)“編輯表”窗口,單擊“唯一約束條件”選項(xiàng),如圖9.3所示。 Oracle 數(shù)據(jù)庫(kù)教程18 圖9.3 “編輯表”窗口“唯一約束條件”選項(xiàng)9.3.1 使用SQL Developer 實(shí)現(xiàn)實(shí)體完整性 Oracle 數(shù)據(jù)庫(kù)教程19(2)單擊“添加”按鈕,在右邊的“名稱”欄中輸入U(xiǎn)NIQUE約束的名稱,在“可用列”欄選擇要添加到UNIQUE約束的列,這里選擇tno列,然后單擊“”按鈕,將其添加到“所選列”中,如圖9.4所示。 9.3.1 使用SQL Develop

16、er 實(shí)現(xiàn)實(shí)體完整性 Oracle 數(shù)據(jù)庫(kù)教程20(3)單擊“確定”按鈕,完成創(chuàng)建UNIQUE約束。如果要?jiǎng)h除UNIQUE約束,打開(kāi)如圖9.4所示的“編輯表”窗口“唯一約束條件”選項(xiàng),選擇要?jiǎng)h除的UNIQUE約束,單擊“刪除”按鈕,單擊“確定”按鈕即可。9.3.2 使用PL/SQL語(yǔ)句實(shí)現(xiàn)實(shí)體完整性1. 使用PL/SQL語(yǔ)句在創(chuàng)建表時(shí)創(chuàng)建PRIMARY KEY約束、UNIQUE約束 9.3.1 使用SQL Developer 實(shí)現(xiàn)實(shí)體完整性 Oracle 數(shù)據(jù)庫(kù)教程219.3.2 使用PL/SQL語(yǔ)句實(shí)現(xiàn)實(shí)體完整性語(yǔ)法格式:CREATE TABLE /*指定表名*/ ( NULL |NOT N

17、ULL /*定義字段*/ CONSTRAINT /*定義約束名*/ PRIMARY KEY | UNIQUE /*定義約束類型*/ ,n , CONSTRAINT PRIMARY KEY | UNIQUE(,n) /*在所有列定義完畢后定義約束名和約束類型*/)說(shuō)明: PRIMARY KEY | UNIQUE:定義約束類型,PRIMARY KEY為主鍵,UNIQUE為唯一鍵。 可以在某一列后面定義PRIMARY KEY約束和UNIQUE約束,也可以在所有列定義完畢后定義PRIMARY KEY約束和UNIQUE約束,但要提供要定義約束的列或列的組合。 Oracle 數(shù)據(jù)庫(kù)教程22【例9.8】對(duì)s

18、tsys數(shù)據(jù)庫(kù)中g(shù)oods3表的商品號(hào)列創(chuàng)建PRIMARY KEY約束,對(duì)商品名稱列創(chuàng)建UNIQUE約束。CREATE TABLE goods3( gid char(6) NOT NULL CONSTRAINT PK_gid PRIMARY KEY, gname char(20) NOT NULL CONSTRAINT UK_gname UNIQUE, gclass char(6) NOT NULL, price number NOT NULL CONSTRAINT CK_price CHECK(price=8000), tradeprice number NOT NULL, stockqt

19、number NOT NULL, orderqt number NULL); 9.3.2 使用PL/SQL語(yǔ)句實(shí)現(xiàn)實(shí)體完整性O(shè)racle 數(shù)據(jù)庫(kù)教程232. 使用PL/SQL語(yǔ)句在修改表時(shí)創(chuàng)建PRIMARY KEY約束或UNIQUE約束語(yǔ)法格式:ALTER TABLE ADD(CONSTRAINT PRIMARY KEY | UNIQUE (,n)說(shuō)明:ADD CONSTRAINT對(duì)指定表增加一個(gè)約束,約束類型為PRIMARY KEY約束或UNIQUE約束。 9.3.2 使用PL/SQL語(yǔ)句實(shí)現(xiàn)實(shí)體完整性O(shè)racle 數(shù)據(jù)庫(kù)教程24【例9.9】在stsys數(shù)據(jù)庫(kù)中首先創(chuàng)建goods4表后,通過(guò)

20、修改表,對(duì)商品號(hào)列創(chuàng)建PRIMARY KEY約束,對(duì)商品名稱列創(chuàng)建UNIQUE約束。創(chuàng)建goods4表語(yǔ)句如下:CREATE TABLE goods4( gid char(6) NOT NULL, gname char(20) NOT NULL, gclass char(6) NOT NULL,price number NOT NULL, tradeprice number NOT NULL, stockqt number NOT NULL, orderqt number NULL); 9.3.2 使用PL/SQL語(yǔ)句實(shí)現(xiàn)實(shí)體完整性O(shè)racle 數(shù)據(jù)庫(kù)教程25通過(guò)修改表,對(duì)商品號(hào)列創(chuàng)建PRIM

21、ARY KEY約束,對(duì)商品名稱列創(chuàng)建UNIQUE約束的語(yǔ)句如下:ALTER TABLE goods4 ADD (CONSTRAINT PK_goodsgid PRIMARY KEY (gid);ALTER TABLE goods4 ADD (CONSTRAINT UK_goodsgname UNIQUE (gname); 9.3.2 使用PL/SQL語(yǔ)句實(shí)現(xiàn)實(shí)體完整性O(shè)racle 數(shù)據(jù)庫(kù)教程263. 使用PL/SQL語(yǔ)句刪除PRIMARY KEY約束、UNIQUE約束語(yǔ)法格式:ALTER TABLE DROP CONSTRAINT ,n;【例9.10】 刪除上例創(chuàng)建的PRIMARY KEY約束

22、、UNIQUE約束。ALTER TABLE goods4 DROP CONSTRAINT PK_goodsgid;ALTER TABLE goods4 DROP CONSTRAINT UK_goodsgname; 9.3.2 使用PL/SQL語(yǔ)句實(shí)現(xiàn)實(shí)體完整性O(shè)racle 數(shù)據(jù)庫(kù)教程279.4 參照完整性表的一列或幾列的組合的值在表中唯一地指定一行記錄,選擇這樣的一列或多列的組合作為主鍵可實(shí)現(xiàn)表的實(shí)體完整性,通過(guò)定義PRIMARY KEY約束來(lái)創(chuàng)建主鍵。外鍵約束定義了表與表之間的關(guān)系,通過(guò)將一個(gè)表中一列或多列添加到另一個(gè)表中,創(chuàng)建兩個(gè)表之間的連接,這個(gè)列就成為第二個(gè)表的外鍵,通過(guò)定義FOREI

23、GN KEY約束來(lái)創(chuàng)建外鍵。使用PRIMARY KEY約束或UNIQUE約束來(lái)定義主表主鍵或唯一鍵,F(xiàn)OREIGN KEY約束來(lái)定義從表外鍵,可實(shí)現(xiàn)主表與從表之間的參照完整性。定義表間參照關(guān)系的步驟是先定義主表主鍵(或唯一鍵),再定義從表外鍵。 Oracle 數(shù)據(jù)庫(kù)教程289.4.1 使用SQL Developer 實(shí)現(xiàn)參照完整性【例9.11】使用SQL Developer,在stsys數(shù)據(jù)庫(kù)中建立student表和score表的參照關(guān)系,再刪除表間參照關(guān)系。(1)按照前面介紹的方法定義主表主鍵,此處已定義student表的sno列為主鍵。(2)啟動(dòng)”SQL Developer”,在”連接”節(jié)

24、點(diǎn)下打開(kāi)數(shù)據(jù)庫(kù)連接”sys_stsys”,展開(kāi)“表”節(jié)點(diǎn),選中表score,單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇”編輯”命令,出現(xiàn)“編輯表”窗口,單擊“外鍵”選項(xiàng)。(3)單擊“添加”按鈕,在右邊的“名稱”欄中輸入外鍵的名稱,這里是score_student_FK1,在“引用表”欄中輸入引用表的 Oracle 數(shù)據(jù)庫(kù)教程29名稱,這里是student,在“關(guān)聯(lián)”欄的“本地列”中顯示可用于創(chuàng)建外鍵的列,可以在下拉列表框中選擇,這里選擇sno,則在”student上的引用列”顯示sno,如圖9.5所示。 9.4.1 使用SQL Developer 實(shí)現(xiàn)參照完整性O(shè)racle 數(shù)據(jù)庫(kù)教程30(4)單擊

25、 “確定”按鈕,完成表間參照關(guān)系的創(chuàng)建。(5)在圖9.5所示的界面中,選擇需要?jiǎng)h除的外鍵,這里是score_student_FK1,單擊“刪除”按鈕,單擊“確定”按鈕,即可刪除選擇的外鍵。1. 使用PL/SQL語(yǔ)句創(chuàng)建表間參照關(guān)系創(chuàng)建主鍵(PRMARY KEY約束)及唯一鍵(UNIQUE約束)的方法在前面已作介紹,這里介紹通過(guò)PL/SQL語(yǔ)句創(chuàng)建外鍵的方法。 9.4.1 使用SQL Developer 實(shí)現(xiàn)參照完整性O(shè)racle 數(shù)據(jù)庫(kù)教程319.4.2 使用PL/SQL語(yǔ)句實(shí)現(xiàn)參照完整性 1)創(chuàng)建表的同時(shí)定義外鍵語(yǔ)法格式:CREATE TABLE ( CONSTRAINT REFERENCE

26、S ( ,.n ) ,n CONSTRAINT FOREIGN KEY ( ,.n ) )其中:= REFERENCES ( ,.n ) ON DELETE CASCADE | SET NULL Oracle 數(shù)據(jù)庫(kù)教程32說(shuō)明: 可以定義列的外鍵約束和表的外鍵約束。定義列的外鍵約束在列定義的后面使用REFERENCES關(guān)鍵字定義外鍵,其對(duì)應(yīng)的主表名的主鍵或唯一鍵的列名,在主表名后面的括號(hào)中指定。定義表的外鍵約束在列定義的后面使用FOREIGN KEY關(guān)鍵字定義外鍵,并在后面包含要定義的列。 定義外鍵定義有以下參照動(dòng)作:ON DELETE CASCADE:定義級(jí)聯(lián)刪除,從主表刪除數(shù)據(jù)時(shí)自動(dòng)刪除

27、從表中匹配的行。ON DELETE SET NULL:從主表刪除數(shù)據(jù)時(shí)設(shè)置從表中對(duì)應(yīng)外鍵鍵列為NULL。如果未指定動(dòng)作,當(dāng)刪除主表數(shù)據(jù)時(shí),如果違反外鍵約束,操作會(huì)被禁止。 9.4.2 使用PL/SQL語(yǔ)句實(shí)現(xiàn)參照完整性 Oracle 數(shù)據(jù)庫(kù)教程33【例9.12】創(chuàng)建stu表,字段名與student表相同,其中sno列作為外鍵,與已建立的以sno列作為主鍵student表創(chuàng)建表間參照關(guān)系,并插入2條記錄:121001,劉鵬翔,1992-08-25和121002,李佳慧,1993-02-18。CREATE TABLE stu( sno char(6) NOT NULL REFERENCES stu

28、dent(sno), sname char(8) NOT NULL, sbirthday date NULL);INSERT INTO stu VALUES(121001,劉鵬,TO_DATE(19920825,YYYYMMDD);INSERT INTO stu VALUES(121002,李佳,TO_DATE(19930218,YYYYMMDD); 9.4.2 使用PL/SQL語(yǔ)句實(shí)現(xiàn)參照完整性 Oracle 數(shù)據(jù)庫(kù)教程34【例9.13】 在stu表中,插入1條student表中不存在學(xué)號(hào)的記錄:121005,王曉燕,1993-10-28;在student表中,刪除1條stu表中已存在學(xué)號(hào)的

29、記錄:121001,劉鵬翔,1992-08-25。INSERT INTO stu VALUES(121005,王曉燕,TO_DATE(19931028,YYYYMMDD);在stu表中插入的1條記錄,其學(xué)號(hào)在student表中不存在,違反FOREIGN KEY約束,系統(tǒng)報(bào)錯(cuò),拒絕插入。DELETE FROM student WHERE sno=121001;在student表中刪除1條記錄,其學(xué)號(hào)在stu表中已存在,違反FOREIGN KEY約束,系統(tǒng)報(bào)錯(cuò),拒絕刪除。 9.4.2 使用PL/SQL語(yǔ)句實(shí)現(xiàn)參照完整性 Oracle 數(shù)據(jù)庫(kù)教程35【例9.14】創(chuàng)建sco表,字段名與score表相

30、同,以學(xué)號(hào)、課程號(hào)組合作為外鍵,與已建立的以學(xué)號(hào)、課程號(hào)組合作為主鍵的score表創(chuàng)建表間參照關(guān)系,并且當(dāng)刪除score表中的記錄時(shí)同時(shí)刪除sco表中與主鍵對(duì)應(yīng)的記錄。創(chuàng)建sco表,定義了外鍵和級(jí)聯(lián)刪除,其語(yǔ)句如下。CREATE TABLE sco( sno char(6)NOT NULL, cno char(4)NOT NULL, grade int NULL, CONSTRAINT FK_sco FOREIGN KEY(sno,cno) REFERENCES score (sno,cno) ON DELETE CASCADE); 9.4.2 使用PL/SQL語(yǔ)句實(shí)現(xiàn)參照完整性 Oracle

31、 數(shù)據(jù)庫(kù)教程36在從表sco表插入與主表score同樣的18條記錄。由于在建立score表和sco表的表間參照關(guān)系時(shí)定義了級(jí)聯(lián)刪除,當(dāng)刪除score表cno為1004的記錄時(shí)自動(dòng)刪除stu表中匹配行。DELETE FROM score WHERE cno=1004;對(duì)主表執(zhí)行結(jié)果進(jìn)行查詢,可以看出,主表已刪除cno為1004的3條記錄,剩下15條記錄。SELECT * FROM score; 9.4.2 使用PL/SQL語(yǔ)句實(shí)現(xiàn)參照完整性 Oracle 數(shù)據(jù)庫(kù)教程37 查詢結(jié)果:SNO CNO GRADE - - -124001 4002 94 124002 4002 74 124003 40

32、02 87 121001 8001 94 121002 8001 88 121004 8001 81 124001 8001 95 124002 8001 73 124003 8001 86 15 rows selected對(duì)從表執(zhí)行結(jié)果進(jìn)行查詢,此時(shí)從表已自動(dòng)刪除cno為1004的3條記錄,剩下15條記錄,實(shí)現(xiàn)了級(jí)聯(lián)刪除。 9.4.2 使用PL/SQL語(yǔ)句實(shí)現(xiàn)參照完整性 Oracle 數(shù)據(jù)庫(kù)教程38SELECT * FROM sco;查詢結(jié)果:SNO CNO GRADE - - -124001 4002 94 124002 4002 74 124003 4002 87 121001 8001

33、 94 121002 8001 88 121004 8001 81 124001 8001 95 124002 8001 73 124003 8001 86 15 rows selected 9.4.2 使用PL/SQL語(yǔ)句實(shí)現(xiàn)參照完整性 Oracle 數(shù)據(jù)庫(kù)教程392)通過(guò)修改表定義外鍵語(yǔ)法格式:ALTER TABLE ADD CONSTRAINT FOREIGN KEY( ,n) REFERENCES (,n) 9.4.2 使用PL/SQL語(yǔ)句實(shí)現(xiàn)參照完整性 Oracle 數(shù)據(jù)庫(kù)教程40【例9.15】 修改stsys數(shù)據(jù)庫(kù)中score表的定義,將它的“課程號(hào)”列定義為外鍵,假設(shè)course

34、表的“課程號(hào)”列已定義為主鍵。ALTER TABLE score ADD CONSTRAINT FK_score_course FOREIGN KEY(cno) REFERENCES course(cno);2. 使用PL/SQL語(yǔ)句刪除表間參照關(guān)系語(yǔ)法格式:ALTER TABLE DROP CONSTRAINT ,n; 9.4.2 使用PL/SQL語(yǔ)句實(shí)現(xiàn)參照完整性 Oracle 數(shù)據(jù)庫(kù)教程41【例9.16】刪除以上對(duì)score課程號(hào)列定義的FK_score_course外鍵約束。ALTER TABLE score DROP CONSTRAINT FK_score_course; 9.4.2 使用PL/SQL語(yǔ)句實(shí)現(xiàn)參照完整性 Oracle 數(shù)據(jù)庫(kù)教程429.5 綜合訓(xùn)練1. 訓(xùn)練要求(1)在stsys數(shù)據(jù)庫(kù)中建立3個(gè)表:st,co,sc(2)將st表中sno修改為主鍵。(3)將st表中的age列的值設(shè)為應(yīng)在1625之間。(4)將sc表中sno設(shè)置為引用sc表中sno列的外鍵。(5)將sc表中cno設(shè)置為引用co表中cno列的外鍵。(6)刪除前面所有的限定。2. 實(shí)現(xiàn)的程序代碼根據(jù)題目要求,編寫(xiě)PL/SQL

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論