成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

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

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

從事南充服務(wù)器托管,服務(wù)器租用,云主機(jī),虛擬主機(jī)申請域名,CDN,網(wǎng)絡(luò)代維等服務(wù)。

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

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

先談?wù)劶s束

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

主鍵是啥

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

    格式:

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

    解釋:

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

    格式:

        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一看就知道對已存在的表進(jìn)行操作語言,添加多個字段的主鍵

    格式:

        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開啟

主鍵到底用于什么地方呢

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

什么是外鍵

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

    格式:

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

    解釋

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

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

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

級聯(lián)更新刪除

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

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

    格式:

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

    解釋:

        那么修改表student增加外鍵設(shè)置為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;

    解釋:

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

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

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

唯一性約束

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

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

    格式:

        alter table student add constraint un_one unique (列);

    解釋:

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

    唯一性約束作為主鍵來補(bǔ)充

檢查約束

    介紹的最后一種約束,學(xué)過編程的朋友檢查約束更好理解,就是代碼流程的控制,按照我的意愿在操作數(shù)據(jù)庫的時候進(jìn)行檢車,不符合將操作失敗,那么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指定范圍約束,有待測試。

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

默認(rèn)值約束

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

    格式:

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

    解釋:

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

    格式:

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

    解釋:

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

    格式:

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

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

    解釋:

        修改列的默認(rèn)值,quantity是指定列明

    格式:

        alter table student modify quantity name default null;

    解釋:

        這是刪除默認(rèn)值的語句,略有不同所以單獨(dú)介紹,其實就是恢復(fù)nullable值。

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

本文題目:淺談數(shù)據(jù)庫約束
本文URL:http://jinyejixie.com/article18/jjpsgp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計、網(wǎng)頁設(shè)計公司、關(guān)鍵詞優(yōu)化、網(wǎng)站導(dǎo)航云服務(wù)器、企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管
洛川县| 犍为县| 广丰县| 怀安县| 竹山县| 确山县| 马鞍山市| 阳春市| 舞阳县| 新安县| 满城县| 横山县| 南乐县| 栾城县| 炎陵县| 洛南县| 鄂托克前旗| 锡林郭勒盟| 环江| 抚州市| 巴青县| 涿鹿县| 海城市| 长泰县| 上思县| 当雄县| 米泉市| 剑川县| 德阳市| 八宿县| 涪陵区| 宜丰县| 泗洪县| 兴隆县| 彩票| 紫阳县| 孟州市| 大同市| 天全县| 金溪县| 平昌县|