2010-07-08 4 views
2

J'ai 2 tables:problème clé composite SQL Server

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

et tableau 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 
) 

Le problème est de savoir comment ajouter la contrainte "fk_numbers_id1" il ne référence une partie du composite clé à partir des numéros de table2. Est-ce possible ou existe-t-il d'autres solutions?

+0

sur la table 1 vous avez un PK unique (dans IDENTITY 1,1), y a-t-il une raison pour laquelle vous devez inclure id2 là-dedans? –

+0

Voici un exemple simplifié, ma vraie application contient des tables plus complexes et je portais en fait du code de mysql vers mssql mais dans mssql certaines instructions se sont arrêtées pour fonctionner – Blablablaster

+0

Merci pour votre aide, contrainte unique c'est ce que je cherchais! – Blablablaster

Répondre

4

Créer une contrainte unique sur numbers2.id1:

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

Je voudrais savoir pourquoi vous avez choisi de créer la clé primaire sur deux colonnes, où la première colonne est déjà unique en elle-même. Je suis sûr que cela viole une sorte de règle de forme normale mais je ne me souviens plus lequel.

Si vous l'avez fait pour couvrir les données dans les deux colonnes, alors il est inutile de le faire, il suffit de ce lieu (en supposant que les données de id1 est véritablement unique):

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, exactement ce que je tapais juste ... –

+0

+1, avec la note supplémentaire que id1 doit effectivement être unique. Être une IDENTITÉ que l'on pourrait attendre est unique, mais n'est pas garanti. –

+0

vous pouvez désactiver l'identité et insérer tout ce que vous liez, de sorte que l'index unique est requis. –

Questions connexes