2012-04-16 108 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