comment faire deux colonnes sont uniques dans SQL Server?

Bons amis,

Je veux savoir comment faire deux colonnes sont uniques dans le server SQL de la manière spéciale que j'ai expliqué ci-dessous.

Le path que je veux:

------------------------- User | Friend | ------------------------- Stevan | Johns } William | David }This is how I want two columns to be unique. 

La façon dont je ne veux pas:

 ------------------------- User | Friend | ------------------------- Steven | Johns } Johns | Steven }This must not allow. 

Steven est un ami de Johns Donc ils sont amis donc je ne veux pas que Johns ajoute une nouvelle ligne en disant que Johns est un ami de Steven.

Steven ajoute une nouvelle ligne comme ceci:

 ------------------------- User | Friend | ------------------------- Steven | Johns } 

Je ne veux pas que John ajoute une rangée à nouveau

 ------------------------- User | Friend | ------------------------- Steven | Johns } Johns | Steven } 

J'espère que ma question est claire, SI quelqu'un connaît une bonne réponse pour cela, s'il vous plaît aidez-moi. Merci d'avance pour toute réponse

Le moyen le plus simple de le faire (toutes choses égales par ailleurs) est d'insister pour que la valeur de la première colonne soit toujours sortingée plus tôt que la valeur de la deuxième colonne:

 CREATE TABLE Friends ( Party1 varchar(20) not null, Party2 varchar(20) not null, constraint CK_Friend_Parties CHECK (Party1 < Party2), constraint CK_Friends_Unique UNIQUE (Party1,Party2) ) 

Si vous ne parvenez pas à accepter ce changement (ce qui est étrange, car il suggère alors que la relation n'est pas symésortingque), vous pouvez l'appliquer via une vue indexée:

 create table dbo.T1 ( Party1 varchar(20) not null, Party2 varchar(20) not null ) go create view dbo.V1 with schemabinding as select CASE WHEN Party1 < Party2 THEN Party1 else Party2 END as NormParty1, CASE WHEN Party1 < Party2 THEN Party2 else Party1 END as NormParty2 from dbo.T1 go create unique clustered index IX_V1 on dbo.V1 (NormParty1,NormParty2) go insert into dbo.T1 (Party1,Party2) values ('Steven','John') go insert into dbo.T1 (Party1,Party2) values ('John','Steven') 

L'insertion finale ci-dessus génère une erreur. Notez que, pour la plupart des intentions, vous ignorez la vue V1 – elle n'existe que pour appliquer cette contrainte (lorsque j'utilise de telles tables, je préfixe habituellement leur nom avec DRI_ pour préciser qu'il n'a pas été créé pour être interrogé.

Je pense, parce qu'une key primaire ne fonctionnera pas, vous devrez utiliser un triggersur pour vérifier si la ligne existe déjà.