您好,登錄后才能下訂單哦!
一、約束的概念
通俗來講,約束是為了使被填入的數據更加符合業務規范、保證數據完整性而開發設計的手段。
如果進行的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 NULL,PRIMARY KEY,FOREIGN KEY,UNIQUE以及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、 說明1:cascade是一個可選選項,例如父表中的主鍵是子表的外鍵,如果我們想禁用父表中的主鍵約束效果同時也禁用字表的外鍵約束,此時就可以啟用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關鍵字,推薦一步步操作;
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。