Moi je suis UNIQUE mais plusieurs fois NULL!
Aujourd'hui, je suis tombé sur un cas des plus embêtant. Imaginez...
Vous avez une table, dans cette table vous voulez qu'un des champs soit gérer de façon unique mais que cette contrainte ne s'applique pas aux valeurs null.
Personnellement, je trouverai ça assez logique que cela fonctionne de cette manière par défaut (des arguments contre?). Que neni (comme on dit ici !).
Obstiné à ne pas vouloir faire cette vérification à un autre niveau que la base de données, je me suis mis à chercher une solution. Et figurez-vous que j'ai trouvé ! Je me souviens, lorsque j'étais encore à l'école (ma jeunesse), j'avais vu un truc du genre :
"Insertion à travers une vue"
Une vue, une vue... Mais SI vous connaissez ! CREATE VIEW... Non ? En fait, les vues permettent d'ajouter une couche d'abstraction à vos tables, ainsi que de facilité vos requêtes dans votre code.
On peut par exemple créer une vue qui ne renverra que les tuples d'une table où tel champs n'est pas null...
Mais, attendez ! ? C'est exactement ça qui nous faut!
Je m'explique...
Si je crée une vue sur ma table qui ne renvoie que les éléments où mon champs unique n'est pas null et que j'applique ma contrainte d'unicité sur cette vue, alors mon problème est résolu !
Exemple :
Nous avons donc une table avec un champ CIDENTI qui est unique mais dont la contrainte d'unicité ne doit pas s'appliquer aux valeurs NULL de ce champ. Nous créons donc une view du genre :
Et ensuite on ajoute la contrainte à la... vue ? Impossible ! ? Nous n'allons pas réellement ajouter une contrainte mais rien ne nous empêche d'ajouter un index sur notre table en spécifiant que cet index doit être unique. Autre problème (décidément) : pour pouvoir ajouter un index, il faut que notre vue soit mappée au schéma de la base de données :
On peut alors créer notre index :
Pas bien compliqué n'est-ce pas ?
Il y a plus qu'a ! En espérant que ça aide!
PS : Si vous avez des commentaires sur la technique, n'hésitez pas !
PS² : Le titre est ironique, je suis pas si nul que ça.
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :