2012-03-16 31 views
2

我有一个列出了汽车的所有不同品牌/型号的表:唯一约束,其中列名不匹配

Make, Model, Year 

每一行都是独一无二的,像“雪佛兰Camaro 1969年”

然后我有一个列出“模型组”的表格,像1967-1969年的Camaros那样经常组合在一起的汽车。所以:

Make, Model, StartYear, EndYear, GroupName 

我增加了一个独特的contraint为“化妆模型StartYear”和“化妆模型EndYear”。

我想添加一个外键映射开始一年回模型表,基本上执行本:

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雪佛兰Camaro”应该执行,有两个“1967年雪佛兰Camaro”和“1969年雪佛兰Camaro”的典范项目。

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

也许我正在以这种错误的方式进行讨论,但我如何确保实际上有一个针对组的开始年和结束年的模型条目?

谢谢, 戴夫

PS:SQL2008 R2

+2

不应该是Model.Year在右侧? – Griffin 2012-03-16 05:26:01

+0

我想格里芬在你的外键映射中询问'Model.StartYear'和'Model.EndYear'条目,即它们*不应该都是'Model.Year'(如果你对这个问题感到困惑) 。 – 2012-03-16 07:03:45

+0

请注意,您缺少序列键,例如'(雪佛兰,Camaro,1968年,1970年,OopsOverlappingCamaro)'' – onedaywhen 2012-03-16 08:56:41

回答

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的主键和唯一约束是没有必要的外键工作。然而它然而在ModelMake, Model, Year上具有主键(或唯一约束)是必需的。

0

我发现这个问题:在模型表的主键有顺序的列:我需要通过

Make, Model, Year 

引用它们

Year, Make, Model 

我不知道内的秩序密钥与外键相关;