Oracle約束簡介
整理自《OCP認證指南》
001 概述
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 約束介紹
- Oracle約束Oracle
- oracle 約束Oracle
- SQLServer約束介紹SQLServer
- Oracle定義約束 外來鍵約束Oracle
- Oracle中的約束簡單入門試驗Oracle
- oracle中的約束Oracle
- oracle 約束詳解Oracle
- oracle鍵約束控制Oracle
- 【SQL】15 SQL 約束(Constraints)、NOT NULL 約束、UNIQUE 約束、PRIMARY KEY 約束、FOREIGN KEY 約束、CHECK 約束、DEFAULT約束SQLAINull
- oracle 註釋和約束Oracle
- 新增/刪除約束(Oracle)Oracle
- oracle的延遲約束Oracle
- Oracle 11g系列:約束Oracle
- 修改oracle的約束欄位Oracle
- PHP中的型別約束介紹PHP型別
- oracle約束學習經典案例Oracle
- oracle 約束的novalidate 應用Oracle
- oracle 約束 enable validate 檢查Oracle
- Oracle主鍵約束、唯一鍵約束、唯一索引的區別(轉)Oracle索引
- Javaweb-約束-外來鍵約束JavaWeb
- oracle外來鍵約束的總結Oracle
- Oracle constraints type 約束型別OracleAI型別
- Oracle基礎 11 約束 constraintsOracleAI
- oracle主外來鍵鎖_lock_約束Oracle
- Oracle約束的學習與測試Oracle
- Oracle 9i 約束條件(轉)Oracle
- 10、Oracle中的約 束constraintOracleAI
- SQL約束SQL
- MySQL 約束MySql
- 03約束
- 綜合約束
- (10)邏輯綜合新增約束(環境約束)
- Oracle如何管理帶約束的B樹索引Oracle索引
- oracle 表遷移方法 (二) 約束不失效Oracle
- Oracle唯一約束中NULL的處理OracleNull
- 差分約束
- Oracle - 約束、索引等相關常用操作語句Oracle索引