第五章 欄位約束 初識約束 約束是資料庫用來確保數據滿足業務規則的手段,對數據做的條件限制。 約束的類型 1. 主鍵約束(PRIMARY KEY) 2. 唯一性約束(UNIQUE) 3. 非空約束(NOT NULL) 4. 檢查約束(CHECK) 5. 外鍵約束(FOREIGN KEY) 主鍵約束( ...
第五章 欄位約束
初識約束
約束是資料庫用來確保數據滿足業務規則的手段,對數據做的條件限制。
約束的類型
1. 主鍵約束(PRIMARY KEY)
2. 唯一性約束(UNIQUE)
3. 非空約束(NOT NULL)
4. 檢查約束(CHECK)
5. 外鍵約束(FOREIGN KEY)
主鍵約束(PRIMARY KEY)
1. 非空加唯一約束;
2. 一個表只有一個主鍵;
3. 主鍵會預設加索引;
student_id number primary key
alter table student add constraint stu_id_pk primary key(stu_id);
唯一性約束(UNIQUE)
對於UNIQUE約束來講,索引是必須的。如果不存在,就自動創建一個(UNIQUE的唯一性本質上是通過索引來保證的)
UNIQUE允許null值,UNIQUE約束的列可存在多個null。這是因為,Unique唯一性通過btree索引來實現,而btree索引中不包含null。所以,這也造成了在where語句中用null值進行過濾會造成全表掃描。
student_num number unique
alter table table_name add constraint student_code_uq unique(student_num);
刪除約束
alter table table_name drop constraint constraint_name;
非空約束(NOT NULL)
非空約束作用的列也叫強制列。顧名思義,強制鍵列中必須有值,當然建表時候若使用default關鍵字指定了預設值,則可不輸入。
score_name varchar2(32) not null
alter table table_name modify student_name not null;
檢查約束(CHECK)
檢查約束可用來實施一些簡單的規則,比如列值必須在某個範圍內。檢查的規則必須是一個結果為true或false 的表達式
student_sex varchar2(1) check(student_sex in('男','女')),
alter table student add constraint stu_sex_ck check(stu_sex in('男','女'));
score_value number check(score_value between 0 and 100)
alter table student add constraint stu_age_ck check(stu_age between 1 and 100);
外鍵約束(FOREIGN KEY)
外鍵約束定義在具有父子關係的子表中,外鍵約束使得子表中的列對應父表的主鍵列,用以維護資料庫的完整性。不過出於性能和後期的業務系統的擴展的考慮,很多時候,外鍵約束僅出現在資料庫的設計中,實際會放在業務程式中進行處理。外鍵約束註意以下幾點:
- 外鍵約束的子表中的列和對應父表中的列數據類型必須相同,列名可以不同
- 對應的父表列必須存在主鍵約束(PRIMARY KEY)或唯一約束(UNIQUE)
- 外鍵約束在子表裡,外鍵的取值範圍不能大於父表鍵值
- 如果想刪除主表的主鍵,需要先刪除子表的關聯欄位
student_num number references table_name(student_num)
alter table student add constraint tea_id_fk foreign key(tea_id) references teacher (tea_id);
註意:
不過在真正的企業開發中,除了主鍵約束這類具有強需求的約束,像外鍵約束,檢查約束更多時候僅僅出現在資料庫設計階段,真實環境卻很少應用,更多是放到程式邏輯中去進行處理。