Уникальное ограничение, где имя столбца не совпадает

У меня есть таблица, в которой перечислены все марки/модели автомобилей:

 Make, Model, Year

Каждый ряд уникален, как "Шевроле Камаро 1969"

Затем у меня есть таблица, в которой перечислены «группы моделей», автомобили, которые часто группируются вместе, например Camaros 1967–1969 годов. Так:

Make, Model, StartYear, EndYear, GroupName

Я добавил уникальное ограничение для «Make-Model-StartYear» и «Make-Model-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

В английском языке групповая строка, в которой говорится «Chevrolet Camaro 1967-1969», должна указывать на то, что есть запись модели как для «Chevrolet Camaro 1967», так и для «Chevrolet Camaro 1969».

Проблема, с которой я сталкиваюсь, заключается в ошибке «Столбцы не соответствуют первичному ключу или существующему ограничению UNIQUE». Но у меня действительно есть уникальные ограничения для «Make-Model-StartYear» и «Make-Model-EndYear».

Возможно, я делаю это неправильно, но как мне убедиться, что запись модели действительно существует как для начального, так и для конечного года группы?

Спасибо, Дэйв

PS: SQL2008 R2


person Dave    schedule 16.03.2012    source источник
comment
Разве это не должно быть Model.Year с правой стороны?   -  person Griffin    schedule 16.03.2012
comment
Я предполагаю, что Гриффин спрашивает о записях Model.StartYear и Model.EndYear в ваших сопоставлениях внешних ключей, то есть, не должны ли они оба быть Model.Year (на случай, если вы озадачены вопросом).   -  person Andriy M    schedule 16.03.2012
comment
Обратите внимание, что вам не хватает последовательного ключа, например. ( Chevrolet, Camaro, 1968, 1970, OopsOverlappingCamaro)   -  person onedaywhen    schedule 16.03.2012


Ответы (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.

person Mikael Eriksson    schedule 16.03.2012

Я обнаружил проблему: первичный ключ в таблице моделей имел столбцы в следующем порядке:

Year, Make, Model

Мне нужно было сослаться на них

Make, Model, Year

Я не знал, что порядок внутри ключа важен для внешних ключей;

person Dave    schedule 16.03.2012