2009-03-10 10 views
3

Dans Sql Server 2005, j'ai une table avec deux colonnes entières, appelons-les Id1 et Id2. J'ai besoin qu'ils soient uniques avec dans la table (assez facile avec un index unique qui couvre les deux colonnes). J'ai aussi besoin qu'ils soient uniques dans le tableau si les valeurs sont transposées entre les deux colonnes.Contraintes SQL Question

Par exemple, SELECT * FROM MyTable retourne

Id1 Id2 
--------- 
2  4 
5  8 
7  2 
4  2 <--- values transposed from the first row 

Comment puis-je faire une contrainte qui empêcherait la dernière rangée d'être entré dans la table, car ils sont les valeurs transposés de la première ligne?

Répondre

6

Créez une contrainte de vérification liée à une fonction définie par l'utilisateur qui effectue une sélection sur la table pour vérifier la valeur transposée.

Create table mytable(id1 int, id2 int) 
go 

create Function dbo.fx_Transposed(@id1 int, @id2 int) 
returns bit as 
Begin 
    Declare @Ret bit 
    Set @ret = 0 
    if exists(Select 1 from MyTable 
     Where id2 = @id1 and id1 = @id2) 
    Set @ret = 1 
    Return @ret 
End 
GO 
Alter table mytable add 
CONSTRAINT [CHK_TRANSPOSE] CHECK 
(([dbo].[fx_Transposed]([ID1],[ID2])=(0))) 
GO 
Insert into mytable (id1, id2) values (1,2) 

Insert into mytable (id1, id2) values (2,1) 
+0

Merci, exactement ce que je cherchais ... –

2

L'ordre entre Id1 et Id2 a-t-il une signification? Si ce n'est pas le cas et qu'il s'agit d'une grande table, il peut être plus performant d'appliquer Id1 < Id2 en plus de votre index unique. Cela aurait un impact sur tout processus de saisie des enregistrements, ce qui pourrait ne pas être faisable.

0

Je créerais un déclencheur qui serait exécuté sur l'insertion et la mise à jour vérifierait en utilisant une instruction select que les valeurs étaient uniques dans les deux colonnes lors de leur transposition et quand elles n'étaient pas transposées. Cela vous permettrait de rejeter toute modification de la table qui enfreindrait vos règles d'unicité au moment de la modification et vous pourriez supprimer l'index unique car il ne fait qu'appliquer une partie de l'exigence.