Contraintes uniques sur les colonnes nulles dans SQL Server 2005


12

Dans ce projet sur lequel je travaille, je dois définir un champ particulier pour qu'il soit unique (pas un problème!) Mais si le champ est nul, je veux que la contrainte soit ignorée. Dans Sql Server 2008, j'utilise un index filtré comme indiqué ci-dessous, mais ce n'est pas disponible dans les versions antérieures de SQL!

CREATE UNIQUE NONCLUSTERED INDEX User_UserName_IUC
ON [User] (pinNr)
WHERE UserName IS NOT NULL

Mais je ne pense pas que cela soit disponible dans SQL Server 2005. En fait, ce billet de blog indique qu'il existe une solution de contournement utilisant un déclencheur pour vérifier l'unicité. Quelqu'un en a-t-il un exemple? ou peut-être une alternative?

Malheureusement, la mise à niveau vers SQl Server 2008 n'est pas une option pour ce client particulier !!

Réponses:


18

En fait, j'ai dû faire quelque chose comme ça une fois. Cela impliquait la création d'une colonne calculée qui prend la valeur de la colonne Unique lorsqu'elle ne l'est pas NULLet la valeur de la clé primaire (avec une autre logique pour rendre impossible le conflit avec les valeurs de la colonne unique), et rendre l'index unique activé cette colonne. Vous pouvez voir un exemple de cela et la méthode de déclenchement ici .


7

Vous pouvez créer une vue (où le nom d'utilisateur n'est pas nul), puis mettre un index unique sur la vue. Vous n'aurez jamais besoin d'utiliser la vue, elle n'existera que pour cela.

Vous pouvez également utiliser cette technique pour appliquer l'unicité sur plusieurs tables, là où cela serait normalement impossible.


2
Les vues indexées ne nécessitent pas l'édition Enterprise. Cependant, ils nécessitent que vous utilisiez l'indicateur de requête WITH (NOEXPAND) pour forcer l'optimiseur de requête d'édition standard à utiliser la vue indexée au lieu de la requête sous-jacente.
Jeremiah Peschka

3
Dans ce cas, bien que le seul point de vue soit d'appliquer la contrainte unique, il s'agit d'une approche parfaitement valide / courante.
Martin Smith

2
Modifié pour supprimer les informations incorrectes sur l'édition Enterprise requises.
Meff

@Meff merci d'avoir pris le temps de répondre aux commentaires ici - J'espère que vous ne serez pas étranger au site: vous pourriez être intéressé par ces questions :)
Jack dit d'essayer topanswers.xyz
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.