Oracle約束簡介

路途中的人2012發表於2016-03-06
整理自《OCP認證指南
001 概述
    表約束是資料庫能夠實施業務規則以及保證資料遵循實體——關係模型的一種手段,其中,實體——關係模型由定義應用程式資料結構的系統分析所確定。
    在針對定義了約束的表執行任何DML時,如果DML違反了約束,則將自動回滾整個語句。注意,如果一個DML語句影響到多個行,那麼,在特定行遇到約束問題前,此語句可能已經區域性成功。如果此語句是多語句事務的一部分,那麼,事務中已經成功語句將保持完好,但不提交。
    考點:如果違反約束,將自動回滾出現問題的整個語句,而不是語句中的單個操作,也不是整個事務。

002 約束型別
    Oracle資料庫支援的約束型別如下:
    ·unique
    ·not Null
    ·primary key
    ·foreign key
    ·check
    約束具有名稱。最好使用標準命名約定指定名稱,如果未顯式指定名稱,Oracle將為其生成名稱。

003 unique約束
    unique約束要求,對於列或列組合而言,表中每行的值必須是不同的。如果此約束針對單個列,則相應的列稱為鍵(key)列。如果約束由多列組成(稱為組合鍵唯一約束),這些列並不必是相同的資料類    型,也不必在表定義中互相鄰近。
    unique約束的怪異之處在於,可以在鍵列中輸入Null值。在鍵列中,可能有任意數量的包含Null值的行。因此,如果不搜尋Null,則可以確保在鍵列上選擇時將僅返回一行;如果搜尋Null,那麼,鍵列為Null的所有行都將返回。
    考點:對於具有unique約束的列,可以插入多個包含Null的行,而對於包含primary key約束的列而言,則不存在這種可能性。    
    unique約束透過索引來實施。在定義unique約束時,Oracle將檢視鍵列上的索引,如果不存在,就建立一個。此後,每次插入行時,Oracle都將檢視索引,瞭解鍵列的值是否已經存在。如果已存在,則將拒絕插入。這些索引(稱為B*樹索引)的結構不包含Null值,正因為如此,才允許出現多個包含Null的行:索引中根本不存在Null。雖然索引的第一要務是實施約束,但也有次生效應:如果在SQL語句的where子句中使用鍵列,效能將會提高。但是,選擇where key_column IS Null則不使用索引(因為它不包括Null),因此總是導致掃描整個表。

004 NOT Null約束
    not Null約束強制在鍵列中輸入值。它針對每個列進行定義,有時被稱為強制列(mandatory column)。如果業務要求一組列都具有值,則不能為整個組定義not Null約束 ,而必須針對每列定義not Null約束。
    如果嘗試插入沒有為具有not Null約束的列指定值的行,將導致錯誤。不懂?????

005 primary key約束
    主鍵(primary key)定位表中單個行的方式。關聯式資料庫範例要求每個表都必須有主鍵,主鍵是用於區分每行的列或列組合。Oracle資料庫的定義與此範例有所不同,它允許存在不包含主鍵的表。
    主鍵約束的實現實際上是unique和not Null約束的組合。鍵列必須具有唯一值,而且不得為空。與unique約束一樣,約束列上必須存在索引。如果不存在,將在定義約束時建立索引。一個表只能有一個主鍵,試著建立第二個,將出現錯誤。但是,表可以有任意數量的unique和not Null約束列。
    考點:unique和primary key約束需要索引。如果不存在,就會自動予以建立。

006 foreign key約束
    在父子關係的子表中定義foreign key約束。此約束使子表中的列(或列組合)對應父表的主鍵列。這些列不必同名,但資料型別必須相同。foreign key約束定義資料庫的關係結構:連線第三正規化的表的多對一關係。
    如果父表具有unique和/或primary key約束,則這些列可用作foreign key約束的基礎,即使允許使用Null值,也是如此。
    考點:外來鍵約束在子表上定義,但此時的父表上必須存在unique或primary key約束。
    unique約束允許約束列中出現Null值,foreign key約束也同樣如此。即使父表的行中不存在Null,也可以將行插入到包含Null外來鍵列的子表中。這會建立孤行,併產生令人不快的混亂。一般而言,unique約束中的所有列以及foreign key約束中的所有列最好也定義not Null約束,這往往是業務要求。
    嘗試在子表中插入父表中沒有匹配行的行,將生成錯誤。同樣,如果父表中的某行在子表中已有引用它的行,則刪除相應的行將引發錯誤。可以使用兩種技術來更改此行為。首先,可將此約束建立為on delete cascade。這意味著,如果刪除父表中的行,那麼Oracle將在子表中搜尋所有匹配行,並刪除它們。這將自動發生。一個較溫和的技術是將約束建立為on delete set null。在此情況下,如果刪除父表中的行,Oracle將在子表中搜尋所有的匹配行,並將外來鍵列設為空。這意味著,子行將稱為孤行,但依然存在。如果子表中的列也有not Null約束,則父表上的刪除操作將失敗。
    即使子表中沒有行,也不能刪除或截斷外來鍵關係中的父表。如果使用on delete set Null或on delete cascade子句,這依然適用。
    foreign key約束的一個變體是自引用foreign key約束。這將定義一個條件,其中的父行和子行存在於同一個表中。

007 check約束
    check約束可用來實施簡單規則,如列中輸入的值必須在一個值域內。規則必須是一個結構為true或false的表示式。規則可以引用作為字面值輸入的絕對值,也可以引用同一行中的其它列,也可以使用一些函式。可以根據需要為一個列應用足夠多的check約束,但無法使用子查詢來計算值是否被允許,也無法使用諸如sysdate等函式。
    提示:not Null約束實際上作為預配置check約束實現。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29067253/viewspace-2048486/,如需轉載,請註明出處,否則將追究法律責任。

相關文章