2012-04-16 141 views
0

我無法找出什麼是錯的,我正在錯誤消息:無法創建外鍵多列主鍵

消息1776,級別16,狀態0,行56在引用表'Airplane_type'中沒有匹配 外鍵 'FK_ 飛機 _make__68487DD7'中的 引用列表的主要或候選 鍵。消息1750,級別16,狀態0,行56 無法創建約束。查看以前的錯誤。

下面是查詢該節:

CREATE TABLE Airplane_type 
(
make VARCHAR NOT NULL, 
model VARCHAR NOT NULL, 
type VARCHAR NOT NULL, 
business_capacity INT NOT NULL, 
economy_capacity INT NOT NULL, 
range INT NOT NULL, 
weight INT NOT NULL, 
length INT NOT NULL, 
wingspan INT NOT NULL, 
PRIMARY KEY(make, model) 
); 

CREATE TABLE Airplane 
(
airplane_ID VARCHAR(3) NOT NULL PRIMARY KEY, 
make VARCHAR NOT NULL FOREIGN KEY REFERENCES Airplane_type(make), 
model VARCHAR NOT NULL FOREIGN KEY REFERENCES Airplane_type(model) 
); 

任何幫助是極大的讚賞,感謝

回答

3

您已經創建了兩列主鍵,不應外鍵是在兩列創建而不是單獨創建?您不能在單個外鍵中引用模型列,因爲原始表中沒有任何內容保證模型是唯一的。

CREATE TABLE Airplane 
(
    airplane_ID VARCHAR(3) NOT NULL PRIMARY KEY, 
    make VARCHAR NOT NULL, 
    model VARCHAR NOT NULL, 
    CONSTRAINT FK_Airplane_type FOREIGN KEY (make, model) 
    REFERENCES Airplane_type(make, model) 
); 

此外,爲什麼你使用VARCHAR沒有指定長度?請閱讀此博客文章: http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar-without-length.aspx

+0

儘管15年以上的SQL服務器我不知道你可以這樣做,當然,他們並沒有幫助我爲你想要的一個原因。 – 2012-04-16 22:00:53

+0

@Troy的另一個提示。把名稱放在你的約束條件下,使用一些標準的命名約定,當車輪脫落時它總是幫助我。 – 2012-04-16 22:03:19

1

由外鍵引用的列必須受主鍵或唯一索引的約束。由於您的主鍵是兩列(make,model)的組合,所以外鍵也應引用相同的組合對。複合鍵作爲約束

0
CREATE TABLE Airplane_type 
(
airplane_type_id not null Identity(1,1), 
make VARCHAR NOT NULL, 
model VARCHAR NOT NULL, 
type VARCHAR NOT NULL, 
business_capacity INT NOT NULL, 
economy_capacity INT NOT NULL, 
range INT NOT NULL, 
weight INT NOT NULL, 
length INT NOT NULL, 
wingspan INT NOT NULL, 
CONSTRAINT PK_AIRPLANE_TYPE PRIMARY KEY(airplane_type_id), 
Constraint UK_Spotted_By_AARON Unique Key (make, model) 
); 

CREATE TABLE Airplane 
(
airplane_ID VARCHAR(3) NOT NULL, 
airplane_type_id int not null CONSTRAINT FK_Airplane_AirPlane_Type 
    Foreign Key References(AirPlane.Airplane_type_id), 
Constraint PK_Airplane Primary Key (Airplane_id), 
); 

使用的部件是不是一個郎中據我所知,如果你正常化,這是不必要的。您的架構中包含製造商和型號組合的飛機不在您的飛機類型表中的方式是有效的。

+0

如何添加標識列並刪除'make,model'上的鍵有助於任何事情?現在你可以重複'make,model',因爲你唯一的唯一約束就是無意義的身份值。至少你應該對'make,model'或者反過來有一個唯一的約束(外鍵約束*可以引用SQL Server中的唯一約束,而不僅僅是主鍵,所以你可以同時擁有這兩個約束)。 – 2012-04-16 21:59:40

+0

我會在這裏猜測一下,並預測你不會坐在代理與自然鍵辯論的同一側。我忘了獨特的約束,給我一分鐘。無意義的身份價值是關鍵... – 2012-04-16 22:09:19

+0

不,我同意代理我只是認爲IDENTITY太常被扔在桌子上,作爲桌子唯一的獨特方面。我對這個問題的回答是基於解釋錯誤信息被拋出的原因,而不是重新設計表格。無論哪種設計,我都沒有看到第二張桌子的目的。 – 2012-04-16 22:15:38