1. 程式人生 > >資料庫設計 聯合主鍵設為外來鍵的問題

資料庫設計 聯合主鍵設為外來鍵的問題

  很多時候我們在資料庫設計中都會遇到這樣的問題:

有兩個表 ,例如(紅色的是主鍵)

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

student(sno,sname,sex,spno,class_no);

專業(專業號,專業名稱,上課學時);

department(spno,sname,semester);

班級:(專業號,班級號,班主任);

class(spno,class_no,header);

這個時候,我們想把student表裡面的class_no設為外來鍵,references  class表,這個時候應該怎麼做呢?

我一開始的做法是:

alter  table student

add constraint  fr_student foreign key(class_no)   references  class(class_no);

會出現什麼問題呢?

訊息 1776,級別 16,狀態 0,第 1 行
在被引用表 'class' 中沒有與外來鍵 'fr_student' 中的引用列列表匹配的主鍵或候選鍵。
訊息 1750,級別 16,狀態 0,第 1 行
無法建立約束。請參閱前面的錯誤訊息。

會報錯!

為什麼呢?

這個時候我們就好好好理解一下定義了!

什麼是外碼,外碼設定有什麼條件?

其中有一點很重要的就是:外碼必須是另外一個表的主碼!

這裡,我們的student表中的class_no如果想要設計成為一個外碼,我們首先要找一下,它是哪一個表的主碼?

class表?

class表中的主碼是(spno,class_no);這個才是class的主碼,是聯合主鍵!

所以,果你設定聯合主鍵,那麼外來鍵必須同時引用兩個主鍵屬性,否則只能用check約束來實現參照關係。

所以,一般這個時候你可以回去看看語意有沒有理解錯誤,我的一開始就是因為語意理解錯誤了,才會出這種情況,我的student表中的(spno,class_no)應該設定成為外來鍵才對。

寫的不好的可以告訴我一下,讓我修改一下