今天在作業的時候,本以爲在SQL中建表是很容易的一件事,可是在實際的設置外鍵方面還出現了一些小插曲,我們知道設置外鍵的命令格式爲:
alter table <表名1> add constraint <約束名> foreign key (需要設置外鍵的列) references <表名2> (與外鍵關聯的列);
如有兩張表分別爲:
create table
actor
(
id integer primary key not null,
name char(36) , --需要設置爲唯一鍵 否則無法成功設置外鍵
)
create table casting
(
movieid varchar(70) not null,
actorid char(36) not null,
ord integer,
primary key(movieid,actorid) --設置複合主鍵
)
alter table casting add constraint cas_actorid_actor foreign key (actorid) references actor (name) --設置外鍵的命令(actorid是外鍵,指向actor表中的對應的演員)
如果像上面這樣來設置外鍵,將會出錯:
服務器: 消息 1776,級別 16,狀態 1,行 1
在被引用表 'actor' 中沒有與外鍵 'cas_actorid_actor' 的引用列的列表匹配的主鍵或候選鍵。
服務器: 消息 1750,級別 16,狀態 1,行 1
未能創建約束。請參閱前面的錯誤信息。
解決方案:這個原因是由於actor表被引用的的字段不是候選鍵或者不是主鍵,說白了就是確保它是唯一的;因此只需要在actor表中的name字段後面添加unique就可以了,即改成name char(36)unique , 就設置好外鍵了。
最後有一點小提示:在設置外鍵約束的時候,要保證外鍵字段的數據類型和大小(長度)要一樣。