列名不匹配的唯一约束

时间:2012-03-16 03:41:26

标签: sql sql-server-2008 foreign-keys unique-constraint

我有一张表格列出了所有不同品牌/型号的汽车:

 Make, Model, Year

每一行都是独一无二的,如“Chevrolet Camaro 1969”

然后我有一张表格列出了“模型组”,这些车经常像1967-1969 Camaros一样组合在一起。所以:

Make, Model, StartYear, EndYear, GroupName

我为“Make-Model-StartYear”和“Make-Model-EndYear”添加了一个独特的约束。

我想添加一个将开始年份映射回到Models表的外键,基本上是强制执行此操作:

Chevrolet, Camaro, 1967, 1969, FirstGenerationCamaro
-> Chevrolet, Camaro, 1967 should exist in the Model table
-> Chevrolet, Camaro, 1969 should exist in the Model table

当我尝试这样做时(在SQL Management Studio中),我创建了一个外键映射:

Group.Make -> Model.Make, Group.Model -> Model.Model, Group.StartYear -> Model.StartYear
Group.Make -> Model.Make, Group.Model -> Model.Model, Group.EndYear   -> Model.EndYear

在英语中,名为“1967-1969 Chevrolet Camaro”的小组应该强制执行“1967年雪佛兰Camaro”和“1969年雪佛兰Camaro”的车型入口。

我遇到的问题是错误“列与主键或现有UNIQUE约束不匹配”。但我确实对“Make-Model-StartYear”和“Make-Model-EndYear”有不明确的限制。

也许我会以错误的方式解决这个问题,但我如何确保该组的开始年份和结束年度实际上都有一个模型条目?

谢谢, 戴夫

PS:SQL2008 R2

2 个答案:

答案 0 :(得分:2)

我不确定您的错误来自何处,但这种接缝可以按照您想要的方式工作。

create table Model
(
  Make varchar(25) not null,
  Model varchar(25) not null,
  Year int not null, 

  primary key (Make, Model, Year)
)

create table ModelGroup
(
  Make varchar(25) not null,
  Model varchar(25) not null,
  StartYear int not null,
  EndYear int not null,
  GroupName varchar(30) not null,

  primary key (Make, Model, StartYear),
  unique (Make, Model, EndYear),
  foreign key (Make, Model, StartYear) references Model(Make, Model, Year),
  foreign key (Make, Model, EndYear) references Model(Make, Model, Year)
)

顺便说一句,ModelGroup中的主键和唯一约束不是外键工作所必需的。 ,但Make, Model, Year中的Model上有一个主键(或唯一约束)是必要的。

答案 1 :(得分:0)

我发现了问题:models表中的主键按顺序包含列:

Year, Make, Model

我需要通过

来引用它们
Make, Model, Year

我不知道密钥中的顺序与外键有关;