資料庫設計 聯合主鍵設為外來鍵的問題
很多時候我們在資料庫設計中都會遇到這樣的問題:
有兩個表 ,例如(紅色的是主鍵)
學生(學號,姓名,性別,專業號,班級號)
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)應該設定成為外來鍵才對。
寫的不好的可以告訴我一下,讓我修改一下