0

我无法找出我收到错误消息的问题:

消息 1776,级别 16,状态 0,行 56 引用表“ Airplane_type ”中没有与外键“FK_Airplane_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)
);

非常感谢任何帮助,谢谢

4

3 回答 3

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不指定长度就使用?请阅读这篇博文:

于 2012-04-16T21:49:33.330 回答
1

外键引用的列必须受主键或唯一索引的约束。由于您的主键是两列(品牌、型号)的组合,因此外键也应该引用相同的组合对。

于 2012-04-16T21:50:53.403 回答
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),
);

据我所知,使用复合键的一部分作为约束并不是一件容易的事,如果你规范化,那就没有必要了。您让架构和型号组合不在您的飞机类型表中的飞机的方式是有效的。

于 2012-04-16T21:58:26.177 回答