2010-07-08 1 views
2

У меня есть 2 таблицы:SQL Server композиционной ключевой проблема

create table numbers2 
(
id1 int IDENTITY(1,1) not null, 
id2 int not null, 
primary key(id1, id2) 
) 

и таблицы 2

create table ttt 
(
id int identity(1,1) not null, 
first_name varchar(50) null, 
last_name varchar(50) null, 
sex varchar(1) check (sex in ('m', 'f')) null, 
number_id int not null, 
id_id1 int not null, 
id_id2 int not null, 
primary key(id), 
constraint fk_numbers_id1 foreign key (id_id1) references numbers2(id1) 
on update no action 
on delete no action 
) 

Проблема заключается в том, как добавить ограничение «fk_numbers_id1» поэтому он будет ссылаться только на одну части композита ключ из табличных чисел2. Возможно ли это или есть другое решение?

+0

На столе 1 у вас есть уникальный ПК (в IDENTITY 1,1), есть ли какая-то причина, по которой вам нужно включить id2? –

+0

Это упрощенное пример, мое реальное приложение содержит более сложные таблицы, и я фактически переносил некоторый код из mysql в mssql, но в mssql некоторые операторы перестали работать – Blablablaster

+0

Спасибо за вашу помощь, уникальное ограничение - то, что я искал! – Blablablaster

ответ

4

Создать уникальное ограничение на numbers2.id1:

create table numbers2 
(
id1 int IDENTITY(1,1) not null, 
id2 int not null, 
primary key(id1, id2), 
unique(id1) 
) 

Я хотел бы знать, почему вы решили создать первичный ключ более двух столбцов, где первый столбец уже является уникальным сам по себе. Я уверен, что это нарушает какое-то правило нормальной формы, но я не могу вспомнить, какой из них.

Если вы сделали это для того, чтобы покрыть данные в обоих столбцах, то нет необходимости делать это, просто сделать это вместо того, чтобы (при условии, что данные в id1 является поистине уникальными):

create table numbers2 
(
id1 int IDENTITY(1,1) not null, 
id2 int not null, 
primary key(id1), 
) 
create index cover_id2 on numbers2(id2) -- no need to include clustered index columns in a covering index 
+0

+1, именно то, что я только что набрал ... –

+0

+1, с дополнительной заметкой, что id1 действительно должен быть уникальным. Будучи ИДЕНТИФИКАЦИЕЙ, которую можно было бы ожидать, она уникальна, но не гарантируется. –

+0

вы можете отключить личность и вставить все, что вы связываете, поэтому необходим уникальный индекс. –