Oracle 約束

一、約束的概念

通俗來講,約束是爲了使被填入的數據更加符合業務規範、保證數據完整性而開發設計的手段。

如果進行的DML(更新、插入、刪除行)或DDL(此處指ALTER更改操作)操作不合符業務規範(約束)要求,則數據庫會拒絕請求;

約束既可以是表級約束也可以是列級約束,需要強調的是notnull 一定是列級的。

在定義約束的時候,正常應該按照語法格式和命名規則進行定義,如若沒有給出約束的名稱,則Oracle會給約束按照SYS_Cn(n爲自然數,由Oracle根據流水生成),如SYS_C001684,推薦大家還是養成良好的學習習慣,正確命名約束;

二、Oracle約束分類

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

三、Oracle約束關係比照圖

約束名

中文含義

約束

類型

命名規範

特徵

備註說明

NOT NULL

非空約束

C

NN_表名_列名

不允許空值

只能定義在列上

UNIQUE

唯一值約束

U

UK_表名_列名

值不允許重複,但是可以爲NULL並且NULL可以有多個,因爲NULL<>NULL,組合列個數不能超過32個。

需要定義UNIQUE的列不能是主鍵列,即一個列不能既有主鍵約束又有UNIQUE約束

PRIMARY KEY

主鍵約束

P

PK_表名

值不能重複並且不能爲NULL,組合列個數不能超過32個。

一個表或視圖只能有一個主鍵

FOREIGN KEY

外鍵約束

R

FK_表名_列名

存的父表主鍵的值,與父表存在依賴關係,插入新值時,如果外鍵的值在父表中沒有則無法插入;

外鍵是把雙刃劍,在增加子父表關係驗證的同時,犧牲了oracle數據性能,現在大型數據設計中會避免使用外鍵。

CHECK

條件約束

C

CK_表名_列名

自定義的約束檢查,按照開發設計者的要求進行定義,比如要求檢查輸入值的符合某個範圍,比如年齡列需要大於等於1歲小於鄧宇120  CHECK(AGE BETWEEN 1 AND  120)

約束條件定義靈活

 

四、約束查看

1、  DBA_CONSTRAINTS:數據庫中所有的約束定義

2、  ALL_CONSTRAINTS:用戶有權限查看的表的約束;

3、  USER_CONSTRAINTS:屬於當前登陸用戶創建的約束;

約束視圖中關鍵字段說明

OWNER:約束創建人

CONSTRAINT_NAME:約束的名字

CONSTRAINT_TYPE:約束的類型,參照上圖

SEARCH_CONDITION:可以通過點擊大文本進行查閱約束具體內容

STATUS:約束當前的狀態,是否有效

五、約束創建

1、  約束正常情況下應當在表設計、創建時定義完整,如若使用中發現需要定義某種約束,這需要首先處理不符合規範要求的數據然後再行定義約束並且時間越早越好。

2、  下面我們會使用CREATETABLE 時創建約束,包括NOT NULLPRIMARY KEYFOREIGN KEYUNIQUE以及CHECK約束。

SQL>CREATETABLEconstraint_test (

                                                    cno VARCHAR2(4) PRIMARYKEY,

                                                               cname VARCHAR2(40) UNIQUE,

                                                               cdate  DATE                     DEFAULTTO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD'),'YYYY-MM-DD')    NOTNULL)

3、  下面是使用ALTER 方式進行後續追加約束的方式

--增加一列備註(note)列,並且要求使用CHECK約束檢查只能輸入字母的字符串

SQL>ALTERTABLE constraint_test ADD note VARCHAR2(100);

SQL>ALTERTABLE constraint_test ADD CONSTRAINT ck_constraint_test_note 

CHECK(REPLACE(TRANSLATE(UPPER(note),'ABCDEFGHIJKLMNOPQRSTUVWXYZ','A'),'')  IS NOT NULL);

六、約束刪除
1、語法格式:ALTERTABLE【表名】 DROPCONSTRAINT【約束名】;

2、舉例:ALTERTABLE constraint_test DROPCONSTRAINTck_constraint_test_note;

 

七、約束重命名

1、  語法格式:

ALTERTABLE【表名】RENAME CONSTRAINT【舊約束名】TO【舊約束名】;

2、舉例:ALTERTABLE constraint_test RENAMECONSTRAINTnn_constraint_test_note TO ck_constraint_test_note;

八、禁用約束

1、  語法格式:

ALTERTABLE【表名】DISABLECONSTRAINT【約束名】CASCADE;

2、  舉例:

ALTERTABLE constraint_test DISABLECONSTRAINTck_constraint_test_note [CASCADE];

3、  說明1cascade是一個可選選項,例如父表中的主鍵是子表的外鍵,如果我們想禁用父表中的主鍵約束效果同時也禁用字表的外鍵約束,此時就可以啓用CASCADE 這個參數;

4、  說明2:如果禁用約束會被Oracle自動創建索引(如主鍵、外鍵、unique等),在禁用該約束的同時也會刪除該約束對應的索引,這顯然對於大數據表來說使我們不想看見的,所以我可以在禁用約束的時候選擇保留索引,方法是:

ALTERTABLE【表名】DISABLECONSTRAINT【約束名】INDEX;

九、啓用約束

1、  語法格式:

ALTERTABLE【表名】ENABLECONSTRAINT【約束名】INDEX;

2、  說明:我們在禁用主鍵和外鍵的時候,可以通過禁用父表的主鍵後加cascade的方式進行偷懶,但是如果重新啓用,則需要單獨一一啓用;

十、        約束狀態

ENABLE(可用)、VALID(有效)、INVALID(無效)、DISABLE(禁用)

十一、  關於使用約束的建議

1、應該在創建表的時候就定義好所需的各種Oracle約束。如果沒有的話,應儘可能早地加上所需要的Oracle約束,這樣會使系統更可靠,更容易維護;(這個視具體情況而言)

2、  Oracle系統進行過多的約束檢查會大大的降低Oracle數據庫系統的效

十二、  十二、約束章節其他

1、  不能在視圖上指定字段爲NULL或者 NOT NULL

2、  使用主鍵、外鍵的報表在刪除的時候,必須依照先刪除字表後刪除父表順序進行操作,或者在父表刪除語句後加cascade關鍵字,推薦一步步操作;

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章