溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

淺談數(shù)據(jù)庫約束

發(fā)布時間:2020-07-12 12:01:07 來源:網(wǎng)絡 閱讀:1297 作者:長路慢 欄目:關(guān)系型數(shù)據(jù)庫

國有國法 家有家規(guī)

其實很多時候技術(shù)和生活息息相關(guān),怎樣的需求就會有出來解決方案

數(shù)據(jù)庫也是那么一個神奇的東西,畢竟是關(guān)系型數(shù)據(jù)庫,數(shù)據(jù)獨立而又可以表表關(guān)聯(lián),有時候就需要約束,在某些時候要規(guī)規(guī)矩矩做人做事,才能更有價值。


先談談約束

    開篇是閑談,約束的根本是保護數(shù)據(jù)庫內(nèi)數(shù)據(jù)的完整性,完整性就是數(shù)據(jù)的精確性和可靠性,那些數(shù)據(jù)庫中的數(shù)據(jù)都符合某種定義規(guī)則,當不符合這些規(guī)則,就會操作失敗。

主鍵是啥

    主鍵防止同一個數(shù)據(jù)表中兩端記錄相同,保證了數(shù)據(jù)的完整性,通過主鍵查詢返回只有一行的數(shù)據(jù),而且主鍵一個表中只有一個(不要與多個字段一個主鍵搞混!),對于主鍵創(chuàng)造的人來說,他們的意識為了保證數(shù)據(jù)唯一的表示,與我們現(xiàn)實生活中很可能有一些差距。我們說一個班級可以有重復名字,但是主鍵意志是不允許的,它提示你重復,所以一般對于多個能夠明確反映真實需求而違背主鍵意志,我們就把主鍵建立在多個列上(仍然是一個主鍵),這樣就可以區(qū)分而來。我們理想的主鍵是id號,可以自動增長的那種,但是數(shù)據(jù)類型都可以成主鍵。

    格式:

        Create table teacher(id number(10) not null primary key);

    解釋:

        創(chuàng)建一個主鍵,沒有加選項自動增長.那么id這一列不可出現(xiàn)重復的值!

    格式:

        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';--表明要大寫,敏感區(qū)分大小寫

        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);

    解釋:

        表已經(jīng)創(chuàng)建好了,alter一看就知道對已存在的表進行操作語言,添加多個字段的主鍵

    格式:

        alter table teacher modify (id number(10) primary key);

    解釋:

        為單列字段添加主鍵

    格式:

        alter table teacher rename constraint pk_one to fk_teacher;--因為主鍵創(chuàng)建時候如果不用constraint關(guān)鍵字后指定主鍵名字(顯示命名) 會自動生成主鍵名,對于我們毫無意義,我們需要根據(jù)自己需求來修改。

        alter table teacher drop primary key;--主鍵就一個表就一個所以關(guān)鍵字后不用指定主鍵名字

        alter table teacher disable primary key;--臨時禁用主鍵 enbale開啟

主鍵到底用于什么地方呢

    當然我們數(shù)據(jù)完整性要求較高最好有主鍵,主鍵本質(zhì)就是為了保證數(shù)據(jù)的完整性,其次就是我們總是用一段字段進行查詢時候,主鍵是不二的選擇,有些表需要和其他表關(guān)聯(lián)而且有時需要同步更新這時候考慮是否便捷于外鍵!

什么是外鍵

    主外主外,就像父子一樣,外鍵更好的輔助主鍵保證數(shù)據(jù)的完整性,而且重要的是表與表之間的約束關(guān)系,插入外鍵表會檢查主鍵字段的數(shù)據(jù),刪除,更新也都會進行校檢。

    格式:

        alter table student add constraint fk_student foreign key (student_id) references teacher (id);

    解釋

        創(chuàng)建一個名字為fk_student的外鍵,把學生表的id關(guān)聯(lián)到來時的id上,就像一對一的家教,一個老師id可以對多個學生id

    修改外鍵一些操作重命名啊,刪除和修改都和主鍵格式大體相同不作啰嗦。

那么我們做更新刪除老師表操作都會失敗,因為已經(jīng)被約束,所以沒有辦法在學生表刪除前刪除老師表,那么外鍵的值可以為空,可以重復的這都是沒問題的。如果老師id更新,學生也該能更新id的,這時候級聯(lián)更新/刪除在這個大背景下就出場了。


級聯(lián)更新刪除

    什么是級聯(lián)更新刪除操作呢,整體來說相互依賴牽扯,在修改主表的時候?qū)耐怄I表也會隨之更新保證了數(shù)據(jù)的完整性。

    級聯(lián)更新涉及了數(shù)據(jù)的校檢:1、及時校檢 2、延遲校檢 其實Oracle中沒有直接實現(xiàn)更新,那么我可以在建立外鍵的時候設置為延遲校檢,注意的是不意味著不校檢,當commit事務提交后仍然會校檢。

    格式:

        alter table student add constraint fk_two foreign key (id) references teacher (id) deferable initially deferred;

    解釋:

        那么修改表student增加外鍵設置為deferable控制是否延遲校檢,initially關(guān)鍵字選擇有兩個參數(shù)1、immediate 2、deferred兩個。

    格式:

        alter table student add constraint fk_three foreign key (id) references teacher (id) on delete cascad;

    解釋:

        那么這是級聯(lián)刪除的操作on delete cascad是關(guān)鍵字

    格式:

        alter table student modify constraint id enable novalidate;

    解釋:

        這個其實很重要,為什么這因為當我們有些時候禁用了外鍵,插入一些數(shù)據(jù)之后發(fā)現(xiàn)無法開啟外鍵因為數(shù)據(jù)完整性不一致,這時候用novalidate關(guān)鍵字,只對以后生成修改的數(shù)據(jù)進行檢驗,跳過之前插入的數(shù)據(jù),而且只是臨時的狀態(tài)。

    alter table student drop constraint 外鍵名字;--刪除外鍵

    外鍵到底干啥用那么從上面的語句也好分析也好只要在一些規(guī)格比較嚴謹?shù)母缸颖砀裰惺抢硐氲倪x擇,同樣在應用程序中應該吧一些外鍵能做好的數(shù)據(jù)約束盡可能的轉(zhuǎn)移到表的外鍵約束上,因為開發(fā)應用程序類于外鍵約束帶來的變化很難把控的,同樣也要禁止過分使用外鍵,會影響設計的可讀性,而且大量的也會影響數(shù)據(jù)庫的性能,對于大量的數(shù)據(jù)對象,還要為子對象建立對象并進行相應的處理。


唯一性約束

    主鍵是表中唯一性保證,為什么還要有唯一性約束。

    那么有一些場景,比如我們理想的表中id代號而且會自動增長的那種作為主鍵,但主鍵只有一個啊,為了業(yè)務等邏輯關(guān)系還需要格外的需求。比較嚴謹?shù)恼f主鍵設計為了唯一性標識一條記錄,唯一性設計為了約束為了保證列自身的唯一性值。

    格式:

        alter table student add constraint un_one unique (列);

    解釋:

        關(guān)鍵字unique 其實看了那么多SQL約束語句我們會發(fā)現(xiàn)格式大同小異,禁用開啟,修改名稱都是一個框里趕出來

    唯一性約束作為主鍵來補充


檢查約束

    介紹的最后一種約束,學過編程的朋友檢查約束更好理解,就是代碼流程的控制,按照我的意愿在操作數(shù)據(jù)庫的時候進行檢車,不符合將操作失敗,那么Oracle中檢車操作是計算布爾值來判斷真假。

    格式:

        Create table student (id number not nul primary key,grade varchar(20),sal number(20) not null,constraint chk_one chkeck (grade in ('老板','經(jīng)理','技術(shù)工') and (grade='老板' and sal >=10000 or grade='經(jīng)理' and sal <= 8000 or grade='技術(shù)工' and sal <= 5000 )));

    解釋:

        這個意思在創(chuàng)建時候有那么一個限制關(guān)系的需求,在grade老板數(shù)據(jù)的工資最低不能低10000,否則不成功,類似于我們if else等判斷語句不知道是否能在and 使用函數(shù)如between指定范圍約束,有待測試。

        還有禁用,重命名,刪除等等格式不一一啰嗦,與上大同小異。


默認值約束

    這個也很有意思,我們在不插入的字段中有些是nullable值,這就是我們的默認值,在Oracle 9i之前默認值只能常量值,在以后版本也可以系統(tǒng)函數(shù)如sysdata來作為默認值使用

    格式:

        create table students (name varchar(20) default '默認值');

    解釋:

        取代nullable變成了字符串默認值顯示,關(guān)鍵字default來指定默認值。

    格式:

        select * from user_tab_column where table_name='STUDENT' and column_name='NAME';

    解釋:

        查看詳細的內(nèi)容(默認值)

    格式:

        alter table student modify quantity name default '你好';

        alter table student modify quantity time default trunc(sysdate,'DD');--這是使用系統(tǒng)變量作為默認值,default trunce來指定重設默認值。

    解釋:

        修改列的默認值,quantity是指定列明

    格式:

        alter table student modify quantity name default null;

    解釋:

        這是刪除默認值的語句,略有不同所以單獨介紹,其實就是恢復nullable值。

那么約束告一段落,其實那么多語句,仔細思考大體格式都是相同,記住各自的特色和關(guān)鍵字(英語好其實零難度),那么在后期的使用中加以運用深入理解,靈活掌握沒問題的。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI