對(duì)于數(shù)據(jù)庫(kù)系統(tǒng)來(lái)說(shuō),擁有一套執(zhí)行基本商業(yè)規(guī)則的方法是非常重要的。如果一個(gè)事物元試圖插入,更新,或者刪除一個(gè)表格行,那么它就違反了商業(yè)規(guī)則,然后,數(shù)據(jù)庫(kù)必須拒絕這個(gè)事物元并在應(yīng)用程序中做錯(cuò)誤的標(biāo)記。雖然通過(guò)程序代碼來(lái)規(guī)范規(guī)則是可行的,但是如果有一個(gè)更加簡(jiǎn)單的方法來(lái)執(zhí)行那是最合人意了。因?yàn)楸砀窨梢酝ㄟ^(guò)SOL*PLUS和其他有效的方法來(lái)訪問(wèn),所以數(shù)據(jù)庫(kù)水平可以通過(guò)提供更好的解決方案來(lái)約束。
Oracle提供了大量的約束完整性和數(shù)據(jù)庫(kù)的觸發(fā)器來(lái)幫助商業(yè)規(guī)則的管理。讓我們暫時(shí)先來(lái)探索一些約束完整性,然后再將焦點(diǎn)放到外碼的約束上,這個(gè)將是我們這篇文章的主要內(nèi)容。
參照完整性(RI)的規(guī)則確定了一對(duì)多和多對(duì)多的關(guān)系強(qiáng)迫在關(guān)系計(jì)劃中。另外,有效值同樣也被約束強(qiáng)迫。對(duì)于Web服務(wù)器應(yīng)用程序來(lái)說(shuō),約束特別重要,因?yàn)閃eb服務(wù)器允許約束在數(shù)據(jù)庫(kù)服務(wù)器中檢查發(fā)生,因此,它擔(dān)當(dāng)了校對(duì)約束的任務(wù)。
在Oracle表格中可以應(yīng)用幾種類型的約束來(lái)規(guī)范數(shù)據(jù)的完整性,它包括:
·檢查約束:在行插入時(shí)間的時(shí)候,這個(gè)約束被有效的引入到列中。在檢驗(yàn)region所有出現(xiàn)的地方時(shí),需要使用一個(gè)應(yīng)用程序來(lái)檢查是東,南,西,或者北,現(xiàn)在,將檢查約束加入到表格說(shuō)來(lái)定義確保region欄的有效性。
·非空約束:這個(gè)約束被用作說(shuō)明一個(gè)列中不包含一個(gè)空值。在SQL insert和update時(shí)間中這個(gè)是被強(qiáng)迫加入的。
·主碼約束:這個(gè)約束是用來(lái)確定表格的主碼。這個(gè)操作需要原來(lái)的列是唯一的,并且,Oracle將在目標(biāo)主碼上創(chuàng)建一個(gè)唯一的索引。
·參考約束:這是外鍵約束由Oracle來(lái)完成。一個(gè)參考約束僅僅應(yīng)用在SQL 的插入和刪除時(shí)間里。比如,一個(gè)一對(duì)多的關(guān)系存在于EMPLOYEE和DEPENDENT表格中,每個(gè)職工可能有許多相依賴的關(guān)系,但是每個(gè)關(guān)系僅僅屬于一個(gè)職工。這個(gè)參考約束在insert時(shí)間告訴Oracle在DEPENDENT.emp_num中的值必須和職員欄中的EMPLOYEE.emp_num相匹配,因此,在關(guān)系欄添加之前一定要確保有效職員存在。如果這個(gè)行依舊存在于DEPENDENT表格中,那么在SQL delete時(shí)間里參照約束可以用來(lái)確定職員不被刪除。
·唯一約束:這個(gè)約束確保表格中所有列的值不會(huì)出現(xiàn)在復(fù)寫條目中。
注意唯一和主鍵的區(qū)別,它們都是創(chuàng)建一個(gè)唯一的索引,一個(gè)表格僅含有一個(gè)主鍵約束列,但是,它有可能在其他列中含有許多的唯一約束。
外鍵約束
參照完整性,外鍵約束確定了表格或者視圖的欄作為外鍵。這個(gè)外鍵欄和一個(gè)主鍵或者唯一鍵在另外一個(gè)表格中建立了直接的關(guān)系。這個(gè)表格包含的外鍵被引用做孩子,并且參考鍵被用做雙親表格。外鍵和參考鍵可以被用在同一個(gè)表格中。除此之外,雙親和子表必須在相同的數(shù)據(jù)庫(kù)中。
下面是創(chuàng)建一個(gè)外鍵約束的語(yǔ)法:
ALTER TABLE (table_name)
ADD
CONSTRAINT (foreign key constraint name)
FOREIGN KEY
( field name )
REFERENCES primary_table_name
(primary_table_primary_index_field)
雖然外鍵約束通常被用在應(yīng)用程序編碼的場(chǎng)所來(lái)進(jìn)行完整性的檢查,但是使用參考完整性的約束加入到I/O開(kāi)銷中來(lái)執(zhí)行insert和update操作是重要的。另外的I/O是可歸于外鍵必須使雙親表有效的事實(shí)。通過(guò)保證參考列表被檢索可使這個(gè)開(kāi)銷最小,在大量的重載中,它在使先前的完整約束喪失能力重載和在重載完成后使約束恢復(fù)能力的過(guò)程中非常有用。一旦約束被激活,任何錯(cuò)誤都可被紀(jì)錄和操作。
參照完整性有時(shí)候需要雙重編碼。比如,在多重SQL*Form中,你也許不知道參照完整性是否違反了規(guī)則直到你將許多頁(yè)面放到表格中并且你的表格試圖提交的事物元的時(shí)候。在Web服務(wù)器應(yīng)用程序中,你需要非常小心的保證Oracle事物元的安全。
參照完整性
一個(gè)數(shù)據(jù)庫(kù)系統(tǒng)要有能力執(zhí)行商業(yè)規(guī)則。參照完整性是Oracle提供給商業(yè)規(guī)則的一個(gè)方法。有關(guān)系統(tǒng)允許商業(yè)規(guī)則利用約束來(lái)控制并參照完整性成了關(guān)聯(lián)表格的骨干。
許多應(yīng)用程序不使用外鍵參考完整性,它們利用應(yīng)用程序代碼來(lái)執(zhí)行商業(yè)規(guī)則。這個(gè)方法并不簡(jiǎn)單因?yàn)閼?yīng)用表格可以通過(guò)其他的方法比如SQL*PLUS被訪問(wèn)。