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