數(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) 編輯 收藏 所屬分類: 測試學習專欄