Уникальное ограничение, когда имя столбца не совпадает - PullRequest
2 голосов
/ 16 марта 2012

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

 Make, Model, Year

Каждый ряд уникален, например, "Chevrolet Camaro 1969"

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

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

На английском языке в группе, в которой написано "Chevrolet Camaro 1967-1969 гг.", Должно быть указано, что имеется образец записи для "Chevrolet Camaro 1967 г." и "Chevrolet Camaro 1969 г.".

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

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

Спасибо, Dave

PS: SQL2008 R2

Ответы [ 2 ]

2 голосов
/ 16 марта 2012

Я не уверен, откуда ваша ошибка, но это похоже на работу так, как вы хотите.

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.

0 голосов
/ 16 марта 2012

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

Year, Make, Model

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

Make, Model, Year

Я не зналэтот порядок в ключе относится к внешним ключам;

...