Oracle约数,Oracle约束简介
整理自《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約束實現。
總結
以上是生活随笔為你收集整理的Oracle约数,Oracle约束简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: node.js以及读取写入文件
- 下一篇: oracle 时间转化函数及常见函数 .