淺談數據庫約束
其實很多時候技術和生活息息相關,怎樣的需求就會有出來解決方案
數據庫也是那麽一個神奇的東西,畢竟是關系型數據庫,數據獨立而又可以表表關聯,有時候就需要約束,在某些時候要規規矩矩做人做事,才能更有價值。
先談談約束
開篇是閑談,約束的根本是保護數據庫內數據的完整性,完整性就是數據的精確性和可靠性,那些數據庫中的數據都符合某種定義規則,當不符合這些規則,就會操作失敗。
主鍵是啥
主鍵防止同一個數據表中兩端記錄相同,保證了數據的完整性,通過主鍵查詢返回只有一行的數據,而且主鍵一個表中只有一個(不要與多個字段一個主鍵搞混!),對於主鍵創造的人來說,他們的意識為了保證數據唯一的表示,與我們現實生活中很可能有一些差距。我們說一個班級可以有重復名字,但是主鍵意誌是不允許的,它提示你重復,所以一般對於多個能夠明確反映真實需求而違背主鍵意誌,我們就把主鍵建立在多個列上(仍然是一個主鍵),這樣就可以區分而來。我們理想的主鍵是id號,可以自動增長的那種,但是數據類型都可以成主鍵。
格式:
Create table teacher(id number(10) not null primary key);
解釋:
創建一個主鍵,沒有加選項自動增長.那麽id這一列不可出現重復的值!
格式:
Create table teacher1(id number(10) not null,name varchar2(20),constraint pk_one primary key (id,name));
解釋:
這個就是主鍵建立多個字段上,但是還是一個主鍵,那麽插入的時候姓名不同,id可以相同,如一本書出版社是主鍵一樣,書名不一樣也是可以的,總有辦法滿足我們的需求。
格式:
select table_name,constraint_name,constraint_type,status from user_constranints where table_name='TEACHER';--表明要大寫,敏感區分大小寫
select constraint_name,table_name,status,column_name from user_cons_columns where table_name = 'TEACHER';
解釋:
一個查詢約束基本信息,另一個視圖查詢約束建立在那一列上;
格式:
alter table teacher add constraint pk_add primary key (id,name);
解釋:
表已經創建好了,alter一看就知道對已存在的表進行操作語言,添加多個字段的主鍵
格式:
alter table teacher modify (id number(10) primary key);
解釋:
為單列字段添加主鍵
格式:
alter table teacher rename constraint pk_one to fk_teacher;--因為主鍵創建時候如果不用constraint關鍵字後指定主鍵名字(顯示命名) 會自動生成主鍵名,對於我們毫無意義,我們需要根據自己需求來修改。
alter table teacher drop primary key;--主鍵就一個表就一個所以關鍵字後不用指定主鍵名字
alter table teacher disable primary key;--臨時禁用主鍵 enbale開啟
主鍵到底用於什麽地方呢
當然我們數據完整性要求較高最好有主鍵,主鍵本質就是為了保證數據的完整性,其次就是我們總是用一段字段進行查詢時候,主鍵是不二的選擇,有些表需要和其他表關聯而且有時需要同步更新這時候考慮是否便捷於外鍵!
什麽是外鍵
主外主外,就像父子一樣,外鍵更好的輔助主鍵保證數據的完整性,而且重要的是表與表之間的約束關系,插入外鍵表會檢查主鍵字段的數據,刪除,更新也都會進行校檢。
格式:
alter table student constraint fk_student forign key (student_id) references teacher (id);
解釋
創建一個名字為fk_student的外鍵,把學生表的id關聯到來時的id上,就像一對一的家教,一個老師id可以對多個學生id
修改外鍵一些操作重命名啊,刪除和修改都和主鍵格式大體相同不作啰嗦。
那麽我們做更新刪除老師表操作都會失敗,因為已經被約束,所以沒有辦法在學生表刪除前刪除老師表,那麽外鍵的值可以為空,可以重復的這都是沒問題的。如果老師id更新,學生也該能更新id的,這時候級聯更新/刪除在這個大背景下就出場了。
級聯更新刪除
什麽是級聯更新刪除操作呢,整體來說相互依賴牽扯,在修改主表的時候對應的外鍵表也會隨之更新保證了數據的完整性。
級聯更新涉及了數據的校檢:1、及時校檢 2、延遲校檢 其實Oracle中沒有直接實現更新,那麽我可以在建立外鍵的時候設置為延遲校檢,註意的是不意味著不校檢,當commit事務提交後仍然會校檢。
格式:
alter table student add constraint fk_two foreign key (id) references teacher (id) deferable initially deferred;
解釋:
那麽修改表student增加外鍵設置為deferable控制是否延遲校檢,initially關鍵字選擇有兩個參數1、immediate 2、deferred兩個。
格式:
alter table student add constraint fk_three foreign key (id) references teacher (id) on delete cascad;
解釋:
那麽這是級聯刪除的操作on delete cascad是關鍵字
格式:
alter table student modify constraint id enable novalidate;
解釋:
這個其實很重要,為什麽這因為當我們有些時候禁用了外鍵,插入一些數據之後發現無法開啟外鍵因為數據完整性不一致,這時候用novalidate關鍵字,只對以後生成修改的數據進行檢驗,跳過之前插入的數據,而且只是臨時的狀態。
alter table student drop constraint 外鍵名字;--刪除外鍵
外鍵到底幹啥用那麽從上面的語句也好分析也好只要在一些規格比較嚴謹的父子表格中是理想的選擇,同樣在應用程序中應該吧一些外鍵能做好的數據約束盡可能的轉移到表的外鍵約束上,因為開發應用程序類於外鍵約束帶來的變化很難把控的,同樣也要禁止過分使用外鍵,會影響設計的可讀性,而且大量的也會影響數據庫的性能,對於大量的數據對象,還要為子對象建立對象並進行相應的處理。
唯一性約束
主鍵是表中唯一性保證,為什麽還要有唯一性約束。
那麽有一些場景,比如我們理想的表中id代號而且會自動增長的那種作為主鍵,但主鍵只有一個啊,為了業務等邏輯關系還需要格外的需求。比較嚴謹的說主鍵設計為了唯一性標識一條記錄,唯一性設計為了約束為了保證列自身的唯一性值。
格式:
alter table student add constraint un_one unique (列);
解釋:
關鍵字unique 其實看了那麽多SQL約束語句我們會發現格式大同小異,禁用開啟,修改名稱都是一個框裏趕出來
唯一性約束作為主鍵來補充
檢查約束
介紹的最後一種約束,學過編程的朋友檢查約束更好理解,就是代碼流程的控制,按照我的意願在操作數據庫的時候進行檢車,不符合將操作失敗,那麽Oracle中檢車操作是計算布爾值來判斷真假。
格式:
Create table student (id number not nul primary key,grade varchar(20),sal number(20) not null,constraint chk_one chkeck (grade in ('老板','經理','技術工') and (grade='老板' and sal >=10000 or grade='經理' and sal <= 8000 or grade='技術工' and sal <= 5000 )));
解釋:
這個意思在創建時候有那麽一個限制關系的需求,在grade老板數據的工資最低不能低10000,否則不成功,類似於我們if else等判斷語句不知道是否能在and 使用函數如between指定範圍約束,有待測試。
還有禁用,重命名,刪除等等格式不一一啰嗦,與上大同小異。
默認值約束
這個也很有意思,我們在不插入的字段中有些是nullable值,這就是我們的默認值,在Oracle 9i之前默認值只能常量值,在以後版本也可以系統函數如sysdata來作為默認值使用
格式:
create table students (name varchar(20) default '默認值');
解釋:
取代nullable變成了字符串默認值顯示,關鍵字default來指定默認值。
格式:
select * from user_tab_column where table_name='STUDENT' and column_name='NAME';
解釋:
查看詳細的內容(默認值)
格式:
alter table student modify quantity name default '你好';
alter table student modify quantity time default trunc(sysdate,'DD');--這是使用系統變量作為默認值,default trunce來指定重設默認值。
解釋:
修改列的默認值,quantity是指定列明
格式:
alter table student modify quantity name default null;
解釋:
這是刪除默認值的語句,略有不同所以單獨介紹,其實就是恢復nullable值。
那麽約束告一段落,其實那麽多語句,仔細思考大體格式都是相同,記住各自的特色和關鍵字(英語好其實零難度),那麽在後期的使用中加以運用深入理解,靈活掌握沒問題的。
淺談數據庫約束