2012-03-16 2 views
2

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

Make, Model, Year 

Каждая строка уникальна, как «Шевроле Камаро 1969»

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

Make, Model, StartYear, EndYear, GroupName 

Я добавил уникальный contraint для "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 

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

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

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

Спасибо, Dave

PS: SQL2008 R2

+2

Не должно быть Model.Year с правой стороны? – Griffin

+0

Я думаю, что Гриффин спрашивает о записях 'Model.StartYear' и' Model.EndYear' в ваших сопоставлениях с внешним ключом, то есть, должны ли они * быть * не должны быть 'Model.Year' (если вас озадачивает вопрос) , –

+0

Обратите внимание, что вам не хватает секвенсированного ключа, например. '(Chevrolet, Camaro, 1968, 1970, OopsOverlappingCamaro)' – onedaywhen

ответ

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.

0

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

Year, Make, Model 

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

Make, Model, Year 

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

Смежные вопросы