我有一张表格列出了所有不同品牌/型号的汽车:
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
答案 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
我不知道密钥中的顺序与外键有关;