qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請訪問 http://qaseven.github.io/

          數(shù)據(jù)庫外鍵的設置與使用

            一·首先是外鍵的作用與設置
            保持數(shù)據(jù)一致性,完整性,主要目的是控制存儲在外鍵表中的數(shù)據(jù)。 使兩張表形成關(guān)聯(lián),外鍵只能引用外表中的列的值!
            例如:
            a b 兩個表
            a表中存有客戶號,客戶名稱
            b表中存有每個客戶的訂單
            有了外鍵后
            你只能在確信b 表中沒有客戶x的訂單后,才可以在a表中刪除客戶x
            建立外鍵的前提: 本表的列必須與外鍵類型相同(外鍵必須是外表主鍵)。
            指定主鍵關(guān)鍵字: foreign key(列名)
            引用外鍵關(guān)鍵字: references <外鍵表名>(外鍵列名)
            事件觸發(fā)限制: on delete和on update , 可設參數(shù)cascade(跟隨外鍵改動), restrict(限制外表中的外鍵改動),set Null(設空值),set Default(設默認值),[默認]no action
            例如:
            outTable表 主鍵 id 類型 int
            創(chuàng)建含有外鍵的表:
            create table temp(
            id int,
            name char(20),
            foreign key(id) references outTable(id) on delete cascade on update cascade);
            說明:把id列 設為外鍵 參照外表outTable的id列 當外鍵的值刪除 本表中對應的列篩除 當外鍵的值改變 本表中對應的列值改變。
            今天有朋友問我"外鍵的作用是什么"
            當朋友問我外鍵的作用是什么時,我也愣了一下,平常都是在這么用,還沒有真正的總結(jié)過,外分鍵的作用呢.下面,我總結(jié)了一下外鍵的作用:
            外鍵 (FK) 是用于建立和加強兩個表數(shù)據(jù)之間的鏈接的一列或多列。通過將保存表中主鍵值的一列或多列添加到另一個表中,可創(chuàng)建兩個表之間的鏈接。這個列就成為第二個表的外鍵。
            FOREIGN KEY 約束的主要目的是控制存儲在外鍵表中的數(shù)據(jù),但它還可以控制對主鍵表中數(shù)據(jù)的修改。例如,如果在 publishers 表中刪除一個出版商,而這個出版商的 ID 在 titles 表中記錄書的信息時使用了,則這兩個表之間關(guān)聯(lián)的完整性將被破壞,titles 表中該出版商的書籍因為與 publishers 表中的數(shù)據(jù)沒有鏈接而變得孤立了。FOREIGN KEY 約束防止這種情況的發(fā)生。如果主鍵表中數(shù)據(jù)的更改使之與外鍵表中數(shù)據(jù)的鏈接失效,則這種更改是不能實現(xiàn)的,從而確保了引用完整性。如果試圖刪除主鍵表中的行或更改主鍵值,而該主鍵值與另一個表的 FOREIGN KEY 約束值相關(guān),則該操作不可實現(xiàn)。若要成功更改或刪除 FOREIGN KEY 約束的行,可以先在外鍵表中刪除外鍵數(shù)據(jù)或更改外鍵數(shù)據(jù),然后將外鍵鏈接到不同的主鍵數(shù)據(jù)上去。
            外鍵是用來控制數(shù)據(jù)庫中數(shù)據(jù)的數(shù)據(jù)完整性的
            就是當你對一個表的數(shù)據(jù)進行操作
            和他有關(guān)聯(lián)的一個或更多表的數(shù)據(jù)能夠同時發(fā)生改變
            這就是外鍵的作用 [精] 談談外鍵
            外鍵 (FK) 是用于建立和加強兩個表數(shù)據(jù)之間的鏈接的一列或多列。通過將保存表中主鍵值的一列或多列添加到另一個表中,可創(chuàng)建兩個表之間的鏈接。這個列就成為第二個表的外鍵。
            FOREIGN KEY 約束的主要目的是控制存儲在外鍵表中的數(shù)據(jù),但它還可以控制對主鍵表中數(shù)據(jù)的修改。例如,如果在 publishers 表中刪除一個出版商,而這個出版商的 ID 在 titles 表中記錄書的信息時使用了,則這兩個表之間關(guān)聯(lián)的完整性將被破壞,titles 表中該出版商的書籍因為與 publishers 表中的數(shù)據(jù)沒有鏈接而變得孤立了。FOREIGN KEY 約束防止這種情況的發(fā)生。如果主鍵表中數(shù)據(jù)的更改使之與外鍵表中數(shù)據(jù)的鏈接失效,則這種更改是不能實現(xiàn)的,從而確保了引用完整性。如果試圖刪除主鍵表中的行或更改主鍵值,而該主鍵值與另一個表的 FOREIGN KEY 約束值相關(guān),則該操作不可實現(xiàn)。若要成功更改或刪除 FOREIGN KEY 約束的行,可以先在外鍵表中刪除外鍵數(shù)據(jù)或更改外鍵數(shù)據(jù),然后將外鍵鏈接到不同的主鍵數(shù)據(jù)上去。
            外鍵是用來控制數(shù)據(jù)庫中數(shù)據(jù)的數(shù)據(jù)完整性的
            就是當你對一個表的數(shù)據(jù)進行操作
            和他有關(guān)聯(lián)的一個或更多表的數(shù)據(jù)能夠同時發(fā)生改變
            這就是外鍵的作用
            主鍵和外鍵是把多個表組織為一個有效的關(guān)系數(shù)據(jù)庫的粘合劑。主鍵和外鍵的設計對物理數(shù)據(jù)庫的性能和可用性都有著決定性的影響。
            必須將數(shù)據(jù)庫模式從理論上的邏輯設計轉(zhuǎn)換為實際的物理設計。而主鍵和外鍵的結(jié)構(gòu)是這個設計過程的癥結(jié)所在。一旦將所設計的數(shù)據(jù)庫用于了生產(chǎn)環(huán)境,就很難對這些鍵進行修改,所以在開發(fā)階段就設計好主鍵和外鍵就是非常必要和值得的。
            主鍵:
            關(guān)系數(shù)據(jù)庫依賴于主鍵---它是數(shù)據(jù)庫物理模式的基石。主鍵在物理層面上只有兩個用途:
            1. 惟一地標識一行。
            2. 作為一個可以被外鍵有效引用的對象。
            基于以上這兩個用途,下面給出了我在設計物理層面的主鍵時所遵循的一些原則:
            1. 主鍵應當是對用戶沒有意義的。如果用戶看到了一個表示多對多關(guān)系的連接表中的數(shù)據(jù),并抱怨它沒有什么用處,那就證明它的主鍵設計地很好。
            2. 主鍵應該是單列的,以便提高連接和篩選操作的效率。
            注:使用復合鍵的人通常有兩個理由為自己開脫,而這兩個理由都是錯誤的。其一是主鍵應當具有實際意義,然而,讓主鍵具有意義只不過是給人為地破壞數(shù)據(jù)庫提供了方便。其二是利用這種方法可以在描述多對多關(guān)系的連接表中使用兩個外部鍵來作為主鍵,我也反對這種做法,理由是:復合主鍵常常導致不良的外鍵,即當連接表成為另一個從表的主表,而依據(jù)上面的第二種方法成為這個表主鍵的一部分,然,這個表又有可能再成為其它從表的主表,其主鍵又有可能成了其它從表主鍵的一部分,如此傳遞下去,越靠后的從表,其主鍵將會包含越多的列了。
            3. 永遠也不要更新主鍵。實際上,因為主鍵除了惟一地標識一行之外,再沒有其他的用途了,所以也就沒有理由去對它更新。如果主鍵需要更新,則說明主鍵應對用戶無意義的原則被違反了。
            注:這項原則對于那些經(jīng)常需要在數(shù)據(jù)轉(zhuǎn)換或多數(shù)據(jù)庫合并時進行數(shù)據(jù)整理的數(shù)據(jù)并不適用。
            4. 主鍵不應包含動態(tài)變化的數(shù)據(jù),如時間戳、創(chuàng)建時間列、修改時間列等。
            5. 主鍵應當有計算機自動生成。如果由人來對主鍵的創(chuàng)建進行干預,就會使它帶有除了惟一標識一行以外的意義。一旦越過這個界限,就可能產(chǎn)生認為修改主鍵的動機,這樣,這種系統(tǒng)用來鏈接記錄行、管理記錄行的關(guān)鍵手段就會落入不了解數(shù)據(jù)庫設計的人的手中。
            外鍵是數(shù)據(jù)庫一級的一個完整性約束,就是數(shù)據(jù)庫基礎理論書中所說的“參照完整性”的數(shù)據(jù)庫實現(xiàn)方式。
            外鍵屬性當然是可以去掉的,如果你不想再用這種約束,對編程當然不會有什么影響,但相應的錄入數(shù)據(jù)的時候就不對錄入的數(shù)據(jù)進行“參照完整性”檢查了。
            例如有兩個表
            A(a,b) :a為主鍵,b為外鍵(來自于B.b)
            B(b,c,d) :b為主鍵
            如果我把字段b的外鍵屬性去掉,對編程沒什么影響。
            如上面,A中的b要么為空,要么是在B的b中存在的值,有外鍵的時候,數(shù)據(jù)庫會自動幫你檢查A的b是否在B的b中存在。
            1、外建表達的是參照完整性:這是數(shù)據(jù)固有的,與程序無關(guān)。因此,應該交給DBMS來做。
            2、使用外建,簡單直觀,可以直接在數(shù)據(jù)模型中體現(xiàn),無論是設計、維護等回有很大的好處,特別是對于分析現(xiàn)有的數(shù)據(jù)庫的好處時非常明顯的--前不久我分析了一個企業(yè)現(xiàn)有的數(shù)據(jù)庫,里面的參照完整性約束有的是外鍵描述,有的是用觸發(fā)器實現(xiàn),感覺很明顯。當然,文檔里可能有,但是也可能不全,但是外鍵就非常明顯和直觀。
            3、既然我們可以用觸發(fā)器或程序完成的這個工作(指參照完整性約束),DBMS已經(jīng)提供了手段,為什么我們要自己去做?而且我們做的應該說沒有RDBMS做得好。實際上,早期的RDBMS并沒有外鍵,現(xiàn)在都有了,我認為數(shù)據(jù)庫廠商增加這個功能是有道理的。從這個角度來說,外鍵更方便。
            4、關(guān)于方便,根據(jù)我?guī)ы椖康那闆r來看,程序員確實有反映,主要是在調(diào)試時輸入數(shù)據(jù)麻煩:如果數(shù)據(jù)可以違反參照完整性,那么就是說參照完整性本身就不對名譽業(yè)務沖突,此時也不應該用觸發(fā)期貨程序?qū)崿F(xiàn);否則,說明數(shù)據(jù)是錯誤的,根本就不應該進入數(shù)據(jù)庫!而且,這也應該是測試系統(tǒng)的一個內(nèi)容:阻止非法數(shù)據(jù)。實際上,前臺程序應該對這種提交失敗做出處理。數(shù)據(jù)是企業(yè)的而非程序的,儲程序要盡量與數(shù)據(jù)分離,反之亦然。最后說一下,建鍵幾個原則:
            1、 為關(guān)聯(lián)字段創(chuàng)建外鍵。
            2、 所有的鍵都必須唯一。
            3、避免使用復合鍵。
            4、外鍵總是關(guān)聯(lián)唯一的鍵字段。
            外鍵的作用?
            外鍵是數(shù)據(jù)庫一級的一個完整性約束,就是數(shù)據(jù)庫基礎理論書中所說的“參照完整性”的數(shù)據(jù)庫實現(xiàn)方式。
            外鍵屬性當然是可以去掉的,如果你不想再用這種約束,對編程當然不會有什么影響,但相應的錄入數(shù)據(jù)的時候就不對錄入的數(shù)據(jù)進行“參照完整性”檢查了。
            例如有兩個表
            A(a,b) :a為主鍵,b為外鍵(來自于B.b)
            B(b,c,d) :b為主鍵
            如果我把字段b的外鍵屬性去掉,對編程沒什么影響。
            如上面,A中的b要么為空,要么是在B的b中存在的值,有外鍵的時候,數(shù)據(jù)庫會自動幫你檢查A的b是否在B的b中存在。
            1、外建表達的是參照完整性:這是數(shù)據(jù)固有的,與程序無關(guān)。因此,應該交給DBMS來做。
            2、使用外建,簡單直觀,可以直接在數(shù)據(jù)模型中體現(xiàn),無論是設計、維護等回有很大的好處,特別是對于分析現(xiàn)有的數(shù)據(jù)庫的好處時非常明顯的--前不久我分析了一個企業(yè)現(xiàn)有的數(shù)據(jù)庫,里面的參照完整性約束有的是外鍵描述,有的是用觸發(fā)器實現(xiàn),感覺很明顯。當然,文檔里可能有,但是也可能不全,但是外鍵就非常明顯和直觀。
            3、既然我們可以用觸發(fā)器或程序完成的這個工作(指參照完整性約束),DBMS已經(jīng)提供了手段,為什么我們要自己去做?而且我們做的應該說沒有RDBMS做得好。實際上,早期的RDBMS并沒有外鍵,現(xiàn)在都有了,我認為數(shù)據(jù)庫廠商增加這個功能是有道理的。從這個角度來說,外鍵更方便。
            4、關(guān)于方便,根據(jù)我?guī)ы椖康那闆r來看,程序員確實有反映,主要是在調(diào)試時輸入數(shù)據(jù)麻煩:如果數(shù)據(jù)可以違反參照完整性,那么就是說參照完整性本身就不對名譽業(yè)務沖突,此時也不應該用觸發(fā)期貨程序?qū)崿F(xiàn);否則,說明數(shù)據(jù)是錯誤的,根本就不應該進入數(shù)據(jù)庫!而且,這也應該是測試系統(tǒng)的一個內(nèi)容:阻止非法數(shù)據(jù)。實際上,前臺程序應該對這種提交失敗做出處理。數(shù)據(jù)是企業(yè)的而非程序的,儲程序要盡量與數(shù)據(jù)分離,反之亦然。
            最后說一下,建鍵幾個原則:
            1、 為關(guān)聯(lián)字段創(chuàng)建外鍵。
            2、 所有的鍵都必須唯一。
            3、避免使用復合鍵。
            4、外鍵總是關(guān)聯(lián)唯一的鍵字段。
            二·設置外鍵后如何進行數(shù)據(jù)操作
            比如你設置了2個表
            pettable
            petid(主)  petname
            ordertable
            peoplename   address  petid(外)
            一個用戶買了一個寵物,那么有了個訂單,如何插入ordertable表呢?
            如下:
            insert into ordertable  select 你輸入的一個name(例如:'peoplename') , petname from pettable where...
            舉一反三刪除數(shù)據(jù)也是一樣

          posted on 2014-07-02 16:40 順其自然EVO 閱讀(458) 評論(0)  編輯  收藏 所屬分類: 測試學習專欄

          <2014年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          統(tǒng)計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 定边县| 广元市| 扎赉特旗| 东台市| 南安市| 绥芬河市| 蓝田县| 西宁市| 沂水县| 郁南县| 桑植县| 德格县| 克拉玛依市| 台湾省| 香港| 湘潭县| 余干县| 龙游县| 淮南市| 襄垣县| 宜兰县| 同仁县| 平南县| 东至县| 翁牛特旗| 绩溪县| 镇坪县| 阳西县| 乌海市| 双牌县| 禄劝| 清流县| 垫江县| 长子县| 盐边县| 伽师县| 营口市| 衢州市| 醴陵市| 平乐县| 遵义市|