Sql server 2008 Can';t使用单列对多列主键创建外键

Sql server 2008 Can';t使用单列对多列主键创建外键,sql-server-2008,constraints,Sql Server 2008,Constraints,我无法找出我收到错误消息的原因: Msg 1776,16级,状态0,第56行没有初级或候选 参考表“飞机类型”中与 在外键中引用列列表 “FK_飞机制造_uuu68487DD7”。Msg 1750,16级,状态0,第56行 无法创建约束。请参阅前面的错误 以下是查询的该部分: CREATE TABLE Airplane_type ( make VARCHAR NOT NULL, model VARCHAR NOT NULL, type VARCHAR NOT NULL, business_cap

我无法找出我收到错误消息的原因:

Msg 1776,16级,状态0,第56行没有初级或候选 参考表“飞机类型”中与 在外键中引用列列表 “FK_飞机制造_uuu68487DD7”。Msg 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)
);

非常感谢您的帮助,谢谢您在两列上创建了主键,外键不应该在两列上创建而不是单独创建吗?您不能在单个外键中引用模型列,因为原始表中没有任何内容可以保证模型是唯一的

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


您已经在两列上创建了主键,外键不应该在两列上创建而不是单独创建吗?您不能在单个外键中引用模型列,因为原始表中没有任何内容可以保证模型是唯一的

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


外键引用的列必须受到主键或唯一索引的约束。因为主键是两列(make、model)的组合,所以外键也应该引用相同的组合对

外键引用的列必须受到主键或唯一索引的约束。因为主键是两列(make、model)的组合,所以外键也应该引用相同的组合对

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),
);
据我所知,使用复合关键点的一部分作为约束并不是一件容易的事,而且如果将其正常化,就没有必要了。在飞机类型表中,您将带有品牌和型号组合的飞机作为模式的方式是有效的


据我所知,使用复合关键点的一部分作为约束并不是一件容易的事,而且如果将其正常化,就没有必要了。您在飞机类型表中使用的模式飞机(其品牌和型号组合不在飞机类型表中)是有效的。

添加标识列并删除
make,model
上的键有什么帮助?现在您可以使用重复的
make,model
,因为您唯一的约束是无意义的标识值。至少在
make,model
上仍然应该有一个唯一的约束,反之亦然(外键约束可以引用SQL Server中的唯一约束,而不仅仅是主键,所以两者都可以)。我将在这里做一个粗略的猜测,并预测您不会站在代理键与自然键争论的同一边。我忘记了唯一的限制,给我一分钟。毫无意义的标识值是重点…不,我同意代理,我只是觉得标识太常见了,被扔到表上,作为表的唯一方面。我对这个问题的回答是基于解释抛出错误消息的原因,而不是重新设计表。在这两种设计中,我都看不到第二个表的用途。另外,您在第二个表中指出了主键约束两次——一次未命名,一次命名。啊,对于“没有键”的表,cookie cutter自动编号方法。我自己也不太喜欢这个,它更像是一个矩形数组而不是一个表。添加一个标识列并删除
make,model
上的键有什么帮助?现在您可以使用重复的
make,model
,因为您唯一的约束是无意义的标识值。至少在
make,model
上仍然应该有一个唯一的约束,反之亦然(外键约束可以引用SQL Server中的唯一约束,而不仅仅是主键,所以两者都可以)。我将在这里做一个粗略的猜测,并预测您不会站在代理键与自然键争论的同一边。我忘记了唯一的限制,给我一分钟。毫无意义的标识值是重点…不,我同意代理,我只是觉得标识太常见了,被扔到表上,作为表的唯一方面。我对这个问题的回答是基于解释抛出错误消息的原因,而不是重新设计表。在这两种设计中,我都看不到第二个表的用途。另外,您在第二个表中指出了主键约束两次——一次未命名,一次命名。啊,对于“没有键”的表,cookie cutter自动编号方法。我自己不太喜欢这个,更多的是一个矩形数组而不是一个表,那个。尽管我使用了15年以上的sql server,但我不知道你能做到这一点,当然他们没有帮我找到你想要的理由。给你的另一个提示@Troy。为你的约束输入名称,使用一些标准命名约定,当轮子转动时,它总是对我有帮助。尽管我使用了超过15年的sql server,但我不知道你能做到这一点,当然他们不会帮我找到你想要的理由。另一个给你的提示@Troy。为你的约束输入名称,使用一些标准的命名约定,当轮子掉下来的时候,它总是对我有帮助。