Oracle表的約束(主鍵約束,外鍵約束,唯一性約束,檢查約束,默認值約束,非空約束)

表的約束

約束的根本目的是保證數據的完整性,主要有主鍵約束、外鍵約束、唯一性約束、檢查約束、默認值約束、非空約束。

域完整性
是對數據表中的字段屬性進行約束,包括字段的值域、字段的類型以及字段的有效規則等約束,域完整性主要包括not null約束,唯一性約束,檢查約束。
實體完整性
即指關係中的主屬性值不能爲null,不能重複。實體完整性是對關係中的記錄唯一性,也就是主鍵的約束。
參照完整性
指關係中的外鍵必須是另一個關係的主鍵的有效值,或指對關係數據庫中建立關聯關係的數據表間數據參照引用的約束,也就是對外鍵的約束。

主鍵約束

主鍵約束可以保證數據完整性,通過將主鍵納入查詢條件可達到查詢結果最多返回一條記錄的目的。
添加主鍵約束語法結構

Alter table 表名 add constraints 約束名 primary key(列名1,列名2,...)

其中約束名可以省略,可以自動產生。主鍵約束在每個數據表中只有一個,可以有多個列組成。

修改主鍵約束

  1. 禁用/啓用主鍵約束
alter table 表名 enable/disable primary  key
  1. 重命名主鍵
alter table 表名 rename constraint 原主鍵名稱 to 新主鍵名稱
  1. 刪除主鍵約束
Alter table 表名 drop primary key;

外鍵約束

foreign key約束即外鍵約束,通過使用外鍵,保證表與表的參照完整性.定義了foreign key約束的列爲“外鍵列”,被foreign key約束引用的列稱爲“引用列"。包含外鍵的表稱爲子表,也成爲引用表,包含引用列的表稱爲父表,也稱爲被引用表。

添加外鍵約束

創建外鍵時,首先在主表中創建主鍵,因爲當使用外鍵尋找主表中的記錄時,必須要找到唯一一條,所以必須在主表中使用主鍵來標識記錄的唯一性。
因爲外鍵是建立在子表上的,首先查看子表customersnew的數據結構以及主表

desc customersnew;
desc employees;

將employee表作爲主(父)表,把cunstomsnew表作爲子表,現在爲cunstomsnew表與employee表建立關聯,在Oracle中提供關鍵字foreign key來實現外鍵約束的添加,語法:

Alter table 子表 add constraint 外鍵名 foreign key(列名)references 主表(列名) on delete cascade——[設置級聯刪除]

添加外鍵約束語法

驗證外鍵約束

外鍵約束創建成功之後,當添加或修改外鍵列爲不合格的數據時,外鍵約束將禁止該動作的執行。

  1. 比如主表employee中沒有employee_id爲001的記錄,但向表中插入新的數據,account_mgr_id列的值爲001,就違反了參照完整性。
  2. 對數據進行更新操作時,無論是更新主表employee中的主鍵列,還是從表customersnew中的外鍵列,都將破壞參照完整性。因此,Oracle將拋出錯誤提示,並禁止修改操作。造成錯誤的原因是,創建主鍵約束時,沒有將約束設置爲級聯刪除。級聯刪除是指,當用戶刪除主表中的某條數據時,Oracle會自動搜索並刪除從表中的相關記錄,如果要實現級聯刪除,需要刪除表中存在的外鍵約束。

修改外鍵約束

刪除外鍵約束與刪除主鍵約束的語法一致,在Oracle中提供了SQL語句drop constraint實現外鍵約束。

Alter 表名 drop constraint 外鍵約束名

外鍵使用場景

** 嚴格遵循父子關係的數據表應該使用外鍵 **

將應用程序中的父子關係轉移到外鍵約束,建立外鍵的確會將表之間的關係複雜化,但是儘量不要通過應用程序來實現本可由外鍵實現的完整性檢查。因爲應用程序實現類似約束需要考慮的情況比較多,容易出現泄露,當程序比較負責時,一旦出現錯誤也很難定位錯誤的位置和原因。而外鍵約束則由數據庫自動處理,相應的定位和處理非常容易。

不要過分使用外鍵,合理使用外鍵可以增加整個系統的健壯性,但是不能過分使用外鍵,首先,使用過多的外鍵會增加數據庫的複雜度,同時會降低設計的可讀性。

foreign key約束具有如下特點:
定義foreign key約束的列中只能包含相應的在其它表中引用的列的值,或爲null。

定義了foreign key約束的外鍵列和相應的引用列可以存在於同一表中,這種情況稱爲”自引用“。

對於同一個列,可以同時定義foreign key約束和not null約束

可以在單個列上定義foreign key約束,也可以在多個列的組合上定義foreign key約束。因此,foreign key約束既可以定義在列級定義,也可以在表級定義。

唯一性約束

唯一性約束(UNIQUE約束)和之前的主鍵約束類似,不同的是,唯一性約束在一個表上可以有多個,而主鍵約束在一個表上只能有一個
** 添加唯一性約束**

alter table 表名 add constraint 唯一性約束名 unique(列名)——[唯一性約束]

驗證唯一性約束
在customersnew表中,數phone_number是唯一的,如果在添加一條重複的電話號碼數據,Oracle會提示錯誤。唯一性約束列允許空值存在,可以將空值設置爲null成功插入數據表。

修改唯一性約束

唯一性約束創建之後,可以對其進行刪除、重命名、禁用/啓用等操作。
重命名唯一性索引

altert table 表名 rename Constraint 原約束名 to 新約束名

禁用/啓用唯一性約束

alter table 表名 disable/enable Constraint 約束名稱

刪除唯一性索引

alter table customersnew drop constraint uk_ph;

唯一性約束使用場景

唯一性約束可以建立在列或者列的組合上,可以作爲主鍵約束的補充。
主鍵列爲id,而id只是一個自增的整數序列,與實際的業務邏輯無關。

檢查約束

添加檢查約束

在創建表之後,我們會發現有些列也需要確定唯一性。這時可以引進檢查約束來實現表的完整性。

Alter table表名 add constraint 檢查約束名 check(條件);

驗證檢查約束

在成功創建檢查約束之後,可以向其中插入非法數據,已驗證其作用。

修改檢查約束

檢查約束創建之後,可以對檢查約束進行重命名、刪除和禁用/啓用等操作。
重命名加檢查約束
檢查約束的重命名和其它約束的重命名具有完全相同的語法,即利用rename選項。

alter table customersnew rename constraint ch_id_city to ck_id_city

禁用/啓用檢查約束
檢查約束的禁用和啓用操作也使用disable/enable選項。
刪除檢查約束
刪除檢查約束與刪除約束的語法一致,在Oracle中提供SQL語句drop constraint實現檢查約束的刪除,

Alter table 表名 drop constraint 檢查約束名

非空約束

在創建表時經常會添加非空約束,以確保字段必須要輸入值。該約束與之前介紹的其它約束不同,它是直接創建列的非空約束。
爲列添加非空約束

Alter table 表名 modify 列名 not null;

撤銷非空約束

Alter table 表名 modify 列名 null;

默認約束

與null值相似,在創建表時,可以通過default關鍵詞指定列的默認值。當向帶有默認值表插入記錄時,如果未指定該列的值,系統會自動採用定義的默認值作爲該列的值。
爲列添加默認約束

Alter table 表名 modify 列名 default ,<default value>

刪除默認(default)約束
刪除默認值約束的方法是將該列設置爲null\

alter table customernew modify status default null;

總結

本章着重講述了Oracle中的幾種主要約束:主鍵約束、外鍵約束、唯一約束、檢查約束、默認值約束、非空約束。外鍵用於約束表之間的關係,而主鍵和唯一性約束則約束表中的記錄;檢查約束和非空約束則針對表中列的值。另外,所有約束都具有非常類似的操作,例如添加、刪除、修改等。本章的重點是,在學習的過程中,對各種約束進行比較學習,這樣可以更好地理解Oracle中的約束。

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