【问题标题】:Unique constraint where column name does not match列名不匹配的唯一约束
【发布时间】:2012-04-01 15:46:46
【问题描述】:

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

 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 Chevrolet Camaro”和“1969 Chevrolet Camaro”都有一个模型条目。

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

也许我的做法是错误的,但我如何确保组的开始年份和结束年份实际上都有一个模型条目?

谢谢, 戴夫

PS:SQL2008 R2

【问题讨论】:

  • 右边不应该是Model.Year吗?
  • 我猜 Griffin 是在询问您的外键映射中的 Model.StartYearModel.EndYear 条目,即 它们 是否不应该都是 Model.Year(如果您对这个问题感到困惑)。
  • 请注意,您缺少序列化的密钥,例如( Chevrolet, Camaro, 1968, 1970, OopsOverlappingCamaro)

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


【解决方案1】:

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

Year, Make, Model

我需要通过

引用它们
Make, Model, Year

我不知道键中的顺序与外键相关;

【讨论】:

    【解决方案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 中的主键和唯一约束不是外键工作所必需的。但是,在Model 中的Make, Model, Year 必须有一个主键(或唯一约束)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-24
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      • 2010-10-11
      • 1970-01-01
      相关资源
      最近更新 更多