SQL中主鍵與外來鍵的定義和區別

2021-07-16 07:04:22 字數 3057 閱讀 4601

主鍵是本張表的主鍵,是唯一且非空的,而外鍵是另一張表中與這張表的某個欄位的型別,欄位名相同的字段,一般是用作關聯兩張或兩張以上的資料表時用的。

以下面三張表為例:

有三張表,一張表是讀者資訊,有乙個屬性為readno,一張表是圖書的資訊,有乙個屬性是bookno,一張表是借閱關係,有兩個屬性分別以讀者資訊表中的readno,和圖書資訊表中的bookno為外來鍵,我想問的是,在借閱關係表中插入資料時不是得自己寫入readno和bookno嗎,這樣,設外來鍵還有什麼作用?

外來鍵取值規則:空值或參照的主鍵值。

(1)插入非空值時,如果主鍵表中沒有這個值,則不能插入。

(2)更新時,不能改為主鍵表中沒有的值。

(3)刪除主鍵表記錄時,你可以在建外鍵時選定外來鍵記錄一起級聯刪除還是拒絕刪除。

(4)更新主鍵記錄時,同樣有級聯更新和拒絕執行的選擇。

簡言之:

起約束作用,就是在借閱關係表中只能插入讀者\圖書資訊表中存在的值

不然會出錯.

作用在於如果你插入的readno或者bookno在兩個表中沒有,就會插不進去

主鍵與外來鍵

一、什麼是主鍵、外來鍵:

關係型資料庫中的一條記錄中有若干個屬性,若其中某乙個屬性組(注意是組)能唯一標識一條記錄,該屬性組就可以成為乙個主鍵 

比如  

學生表(學號,姓名,性別,班級) 

其中每個學生的學號是唯一的,學號就是乙個主鍵 

課程表(課程編號,課程名,學分) 

其中課程編號是唯一的,課程編號就是乙個主鍵 

成績表(學號,課程號,成績) 

成績表中單一乙個屬性無法唯一標識一條記錄,學號和課程號的組合才可以唯一標識一條記錄,所以 學號和課程號的屬性組是乙個主鍵 

成績表中的學號不是成績表的主鍵,但它和學生表中的學號相對應,並且學生表中的學號是學生表的主鍵,則稱成績表中的學號是學生表的外來鍵 

同理 成績表中的課程號是課程表的外來鍵 

定義主鍵和外來鍵主要是為了維護關聯式資料庫的完整性,總結一下:

主鍵是能確定一條記錄的唯一標識,比如,一條記錄包括身份正號,姓名,年齡。身份證號是唯一能確定你這個人的,其他都可能有重複,所以,身份證號是主鍵。 

外來鍵用於與另一張表的關聯。是能確定另一張表記錄的字段,用於保持資料的一致性。比如,a表中的乙個字段,是b表的主鍵,那他就可以是a表的外來鍵。二、  主鍵、外來鍵和索引的區別 收藏

主鍵、外來鍵和索引的區別?

主鍵 外來鍵

索引定義:

唯一標識一條記錄,不能有重複的,不允許為空

表的外來鍵是另一表的主鍵

, 外來鍵可以有重複的

,可以是空值

該欄位沒有重複值,但可以有乙個空值

作用:用來保證資料完整性

用來和其他表建立聯絡用的

是提高查詢排序的速度

個數:主鍵只能有乙個

乙個表可以有多個外來鍵

乙個表可以有多個惟一索引

聚集索引和非聚集索引的區別?

聚集索引一定是唯一索引。但唯一索引不一定是聚集索引。  

聚集索引,在索引頁裡直接存放資料,而非聚集索引在索引頁裡存放的是索引,這些索引指向專門的資料頁的資料。

鍵和外來鍵是把多個表組織為乙個有效的關聯式資料庫的粘合劑。主鍵和外來鍵的設計對物理資料庫的效能和可用性都有著決定性的影響。

必須將資料庫模式從理論上的邏輯設計轉換為實際的物理設計。而主鍵和外來鍵的結構是這個設計過程的癥結所在。一旦將所設計的資料庫用於了生產環境,就很難對這些鍵進行修改,所以在開發階段就設計好主鍵和外來鍵就是非常必要和值得的。

首先來談:主鍵。

關聯式資料庫依賴於主鍵—它是資料庫物理模式的基石。主鍵在物理層面上只有兩個用途:

1. 惟一地標識一行。

2. 作為乙個可以被外來鍵有效引用的物件。

基於以上這兩個用途,下面給出了我在設計物理層面的主鍵時所遵循的一些原則:

1. 主鍵應當是對使用者沒有意義的。如果使用者看到了乙個表示多對多關係的連線表中的資料,並抱怨它沒有什麼用處,那就證明它的主鍵設計地很好。

2. 主鍵應該是單列的,以便提高連線和篩選操作的效率。

注:使用復合鍵的人通常有兩個理由為自己開脫,而這兩個理由都是錯誤的。其一是主鍵應當具有實際意義,然而,讓主鍵具有意義只不過是給人為地破壞數 據庫提供了方便。其二是利用這種方法可以在描述多對多關係的連線表中使用兩個外部鍵來作為主鍵,我也反對這種做法,理由是:復合主鍵常常導致不良的外來鍵, 即當連線表成為另乙個從表的主表,而依據上面的第二種方法成為這個表主鍵的一部分,然,這個表又有可能再成為其它從表的主表,其主鍵又有可能成了其它從表 主鍵的一部分,如此傳遞下去,越靠後的從表,其主鍵將會包含越多的列了。

3. 永遠也不要更新主鍵。實際上,因為主鍵除了惟一地標識一行之外,再沒有其他的用途了,所以也就沒有理由去對它更新。如果主鍵需要更新,則說明主鍵應對使用者無意義的原則被違反了。

4. 主鍵不應包含動態變化的資料,如時間戳、建立時間列、修改時間列等。

5. 主鍵應當有計算機自動生成。如果由人來對主鍵的建立進行干預,就會使它帶有除了惟一標識一行以外的意義。一旦越過這個界限,就可能產生認為修改主鍵的動機,這樣,這種系統用來鏈結記錄行、管理記錄行的關鍵手段就會落入不了解資料庫設計的人的手中。

外來鍵是用來和其他表建立聯絡用的:這個表中的一列和另外乙個表中的一列相同,為了讓這兩個表聯絡起來,就把其中乙個表中的列設成外來鍵,把另外乙個表列設成主鍵,就實現了這兩個表的關聯。

ps:乙個表可以有多個外來鍵。但主鍵只能有乙個。

主鍵:

能夠唯一表示資料表中的每個記錄的【字段】或者【字段】的組合就稱為主碼(主鍵)。 乙個主鍵是唯一識別乙個表的每一記錄,但這只是其作用的一部分,主鍵的主要作用是將記錄和存放在其他表中的資料進行關聯。在這一點上,主鍵是不同表中各記 錄之間的簡單指標。主鍵約束就是確定表中的每一條記錄。主鍵不能是空值。唯一約束是用於指定乙個或多個列的組合值具有惟一性,以防止在列中輸入重複的值。 所以,主鍵的值對使用者而言是沒有什麼意義,並且和它要賦予的值也沒有什麼特別的聯絡。

外來鍵:若有兩個表a,b,c是a的主鍵,而b中也有c欄位,則c就是表b的外來鍵。外來鍵約束主要用來維護兩個表之間資料的一致性。

a為基本表,b為資訊表!!!!!!!!!!

**:

Sql 主鍵與外來鍵

三張表 s s sname,gender,age c c cname,tname sc sc s c grade s 為學生號 主鍵 sname為學生姓名,c 為課程號 主鍵 cname為課程名,tname為老師姓名,sc中使用外來鍵關聯 請編寫sql語句完成下列操作 1.將 oracle 成績最高...

SQL中主鍵外來鍵關係

在學過資料庫以後對於約束的概念就不是太陌生了,即 約束 constraint 是microsoft sql server 提供的自動保持資料庫完整性的一種方法,定義了可輸入表或表的單個列中的資料的限制條件 當然主鍵和外來鍵也不例外也是保持資料完整性的一種方法,接下來就針對主外來鍵來展開講述。主鍵和外...

SQL 主鍵和外來鍵約束

sql 的主鍵和外來鍵的作用 外來鍵取值規則 空值或參照的主鍵值。1 插入非空值時,如果主鍵表中沒有這個值,則不能插入。2 更新時,不能改為主鍵表中沒有的值。3 刪除主鍵表記錄時,你可以在建外鍵時選定外來鍵記錄一起級聯刪除還是拒絕刪除。4 更新主鍵記錄時,同樣有級聯更新和拒絕執行的選擇。簡而言之,s...