1. 程式人生 > >轉 ORACLE約束總結

轉 ORACLE約束總結

pos 代碼 relation 業務規則 類型比較 define eating 掌握 11g

https://www.cnblogs.com/kerrycode/archive/2012/05/13/2454614.html

你對ORACLE約束的了解如何?比較模糊還是相當透徹?如果你對下面幾個問題了如指掌的話,恭喜你,你已經對約束掌握得比較好了,不用看這篇文章了。ORACLE的約束有啥功能作用? 有哪些類型約束(不同版本ORACLE是否不同)?視圖有約束嗎?約束是否會影響SQL性能? 約束信息存儲在哪些系統視圖、數據字典中?約束能否修改名稱?能否禁用約束?延遲約束有啥好處.......

約束定義

約束是強加在表上的規則或條件。確保數據庫滿足業務規則。保證數據的完整性。當對表進行DML或DDL操作時,如果此操作會造成表中的數據違反約束條件或規則的話,系統就會拒絕執行這個操作。約束可以是列一級別的 也可以是表級別的。定義約束時沒有給出約束的名字,ORACE系統將為該約束自動生成一個名字,其格式為SYS_Cn,其中n為自然數(強烈建議各位在創建表或增加約束時,給約束定義名稱。).

約束功能

約束的功能:實現一些業務規則,防止無效的垃圾數據進入數據庫,維護數據庫的完整性(完整性指正確性與一致性)。從而使數據庫的開發和維護都更加容易。

約束分類


約束分為6類: 非空(NOT NULL)約束、 唯一(UNIQUE)約束、主鍵(PRIMARY KEY)約束、外鍵(FOREIGN KEY)約束、條件(CHECK)約束、REF約束。

非空(NOT NULL)約束:顧名思義,所約束的列不能為NULL值。否則就會報錯

唯一(UNIQUE)約束:在表中每一行中所定義的這列或這些列的值都不能相同。必須保證唯一性。否則就會違法約束條件。

主鍵(PRIMARY KEY)約束:唯一的標識表中的每一行,不能重復,不能為空。 創建主鍵或唯一約束後,ORACLE會自動創建一個與約束同名的索引(UNIQUENES為UNIQUE唯一索引)。需要註意的是:每個表只能有且有一個主鍵約束。

外鍵(FOREIGN KEY)約束:用來維護從表(Child Table)和主表(Parent Table)之間的引用完整性. 外鍵約束是個有爭議性的約束,它一方面能夠維護數據庫的數據一致性,數據的完整性。防止錯誤的垃圾數據入庫; 另外一方面它會增加表插入、更新等SQL性能的額外開銷,不少系統裏面通過業務邏輯控制來取消外鍵約束。例如在數據倉庫中,就推薦禁用外鍵約束。

條件(CHECK)約束:表中每行都要滿足該約束條件。條件約束既可以在表一級定義也可以在列一級定義。在一列上可以定義任意多個條件約束。

REF約束的定義:REF column by definition references an object in another object type or in a relational table. A REF constraint lets you further describe the relationship between the REF column and the object it references.

ORACLE 11 數據庫的約束類型如下:

技術分享圖片


ORACLE 10 數據庫的約束類型如下:

技術分享圖片

在oracle 官方文檔http://docs.oracle.com/cd/B19306_01/server.102/b14237/statviews_1037.htm下


C      (check constraint on a table)
P      (primary key)
U      (unique key)
R      (referential integrity)
V      (with check option, on a view)
O      (with read only, on a view)


http://docs.oracle.com/cd/B28359_01/server.111/b28286/clauses002.htm

http://docs.oracle.com/cd/B28359_01/server.111/b28320/statviews_1044.htm#REFRN20047


C      Check constraint on a table
P      Primary key
U      Unique key
R      Referential integrity
V      With check option, on a view
O      With read only, on a view
H      Hash expression
F      Constraint that involves a REF column
S      Supplemental logging


對於H、S類型,尚不清楚情況,而且從上面我在11g數據庫實驗結果看,也沒發現這兩種類型。(有了解的朋友可以告知一二)


約束命名規範

約束名稱建議自己定義一套命名規則,否則使用系統生成的約束名,很難能把它和對應的表、字段聯系起來。

    非空約束     NN_表名_列名
    唯一約束     UK_表名_列名
    主鍵約束     PK_表名
    外鍵約束     FK_表名_列名
    條件約束     CK_表名_列名
    默認約束     DF_表名_列名

如果約束名稱超過32位長度,建議應該縮寫表名,而不應用NN_表名_數字。不過具體視情況而定,很多時候 DF_表名_列名 這樣命名,往往超出了32字符。所以有時候需要縮寫表面或是采用其它規則。

約束操作

  約束管理

   創建各類約束

  先看一下如何創建主鍵約束

技術分享圖片
CREATE TABLE "DM"."DEPT" 
(    
               "DEPTNO"     NUMBER(2,0) PRIMARY KEY, 
               "DNAME"      VARCHAR2(14), 
               "LOC"        VARCHAR2(13) 
)   TABLESPACE "TBS_DM_DAT" ;
  
COMMENT ON TABLE "DM"."DEPT" IS ‘部門表‘;                    
                                                             
COMMENT ON COLUMN "DM"."DEPT"."DEPTNO"        IS  ‘部門編號‘;    
                                                             
COMMENT ON COLUMN "DM"."DEPT"."DNAME"         IS  ‘部門名稱‘;    
                                                             
COMMENT ON CLOUMN "DM"."DEPT"."LOC"           IS  ‘部門所在地方‘;
技術分享圖片

此時它的約束名稱是系統創建的。如圖所示:

技術分享圖片

如果我們以下面的腳本創建,此時約束如下所示

技術分享圖片
 1 CREATE TABLE "DM"."DEPT" 
 2 (    
 3                "DEPTNO"           NUMBER(2,0)    , 
 4                "DNAME"           VARCHAR2(14)    , 
 5                "LOC"              VARCHAR2(13)    , 
 6                CONSTRAINT "PK_DEPT" PRIMARY KEY ("DEPTNO") USING INDEX TABLESPACE TBS_DM_IN
 7 )   TABLESPACE "TBS_DM_DAT" ;
 8  
 9 
10   
11   
12 COMMENT ON TABLE "DM"."DEPT" IS ‘部門表‘;
13 
14 COMMENT ON COLUMN "DM"."DEPT"."DEPTNO"          IS  ‘部門編號‘;
15 
16 COMMENT ON COLUMN "DM"."DEPT"."DNAME"            IS  ‘部門名稱‘;
17 
18 COMMENT ON CLOUMN "DM"."DEPT"."LOC"              IS  ‘部門所在地方‘;
19   
技術分享圖片

技術分享圖片

如果一個表的約束類型比較多,你會看到一堆SYS_CN這樣的約束,如果不仔細核對後面的字段,很難一眼看出約束類型、約束對應字段。

主鍵約束的限制

文檔原文如下: (翻譯在下)
  Restrictions on Primary Key Constraints Primary constraints are subject to the following restrictions:

  A table or view can have only one primary key.
  一個表或視圖有且只有一個主鍵

  None of the columns in the primary key can be LOB, LONG, LONG RAW, VARRAY, NESTED TABLE, BFILE, REF, TIMESTAMP WITH TIME ZONE, or user-defined type. However, the primary key can contain a column of TIMESTAMP WITH LOCAL TIME ZONE.
  主鍵字段不能為LOB、LOG、LOG RAW、VARRAY、NESTED TABLE、BFILE、REF、TIMESTAMP WITH TIME ZONE或用戶定義類型。然而它可以包含TIMESTAMP WITH LOCAL TIME ZONE類型的字段。

  The size of the primary key cannot exceed approximately one database block.
  主鍵大小不能超過一個數據塊大小。

  A composite primary key cannot have more than 32 columns.
  主鍵組合鍵不能超過32列。

  You cannot designate the same column or combination of columns as both a primary key and a unique key.
  你不能指定一列或組合列既是主鍵又是唯一鍵。

  You cannot specify a primary key when creating a subview in an inheritance hierarchy. The primary key can be specified only for the top-level (root) view.
  創建一個繼承層次結構中的子視圖時,你不能指定一個主鍵。主鍵可以唯一指定的頂層(根)視圖。

轉 ORACLE約束總結