无法针对多列主键使用单个列创建外键

时间:2012-04-16 21:46:55

标签: sql-server-2008 constraints

我无法找到错误消息的错误:

  

Msg 1776,Level 16,State 0,Line 56没有小学或候选人   引用表'Airplane_type'中与之匹配的键   引用外键中的列列表   'FK_ 飞行 _make__68487DD7'。 Msg 1750,Level 16,State 0,Line 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 个答案:

答案 0 :(得分: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?请阅读此博客文章:

答案 1 :(得分:1)

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

答案 2 :(得分: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),
);

使用复合键的一部分作为约束并不是我所知道的,如果你正常化,那就不必要了。您的架构使用不在飞机类型表中的品牌和型号组合的飞机的方式是有效的。