qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          數據庫外鍵的設置與使用

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

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

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

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 安义县| 盐津县| 平乡县| 临夏县| 柳江县| 长宁县| 郑州市| 望谟县| 弋阳县| 遂溪县| 宾川县| 龙川县| 上思县| 山丹县| 峨边| 搜索| 乌审旗| 太康县| 龙门县| 津市市| 武城县| 余江县| 杭锦旗| 宁陕县| 通许县| 徐水县| 南岸区| 临安市| 佛坪县| 德惠市| 平利县| 扎赉特旗| 南陵县| 临西县| 祁东县| 太保市| 普洱| 太谷县| 胶南市| 华安县| 东莞市|