Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Le blog technique de Loïc Bar

Nouvelles technologies Web

Award

  • mvp

J'y serai...

Mes livres

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 :

image

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 :

image

On peut alors créer notre index :

image

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 :
Posted: jeudi 28 août 2008 15:03 par loicbar
Classé sous : , ,

Commentaires

Mimetis a dit :

Salut, tu as une solution trés élégante si tu as la chance d'utiliser Sql Server 2008 : Les index filtrés:

<a href="http://www.dotmim.com/blogs/mim/archive/2008/02/26/sql-server-2008-filter-index.aspx">Un petit exemple ici</a>

<a href="http://blog.djeepy1.net/post/2007/10/30/Contrainte-dintegrite-%3A-Unique-ou-NULL">ici</a>

# août 28, 2008 13:20

christian a dit :

Plusieurs commentaires :

- Ton code ne fonctionne pas, en effet le Trigger interdit TOUTES insertions dans la table !!!

- Ca n'a aucun intérêt d'interdire l'utilisation de la table étant donné que la fonctionnalité utilisée ici est une vue indexée, comme le principe de celle-ci est de matérialiser les données de manière automatiqe et synchone l'index unique s'applique en respectant le filtre de la vue automatiquement à la table. Inutile de créer le Trigger et encore pus inute de passer par la vue pour réaliser les Insert. La seule création de l'index sur la vue assure le fonctionnement optimal de la contrainte.

- C'est une vue indexée, avec toutes les contraintes que çà implique (certaines options interdites lors de la mise à jour de la table).

- D'accord avec Mim, l'index filtré sur SQL 2008 est plus sexy et moins contraignant !

J'ajouterais que le fait d'accepter plusieurs valeurs NULL pour une contrainte ou un index unique est un élément défini par la norme SQL et que seul les moteurs Microsoft et Sybase ne la respecte pas ! C'est pas catastrophique, mais il faut faire avec !

# août 28, 2008 13:53

loicbar a dit :

Thanks Christain pour ton commentaire, je venais justement de m'en rendre compte mais les erreurs SQL Server sont tellement précise que je pensais qu'il s'agissait d'une autre erreur!

C'est clair que c'est pas super de devoir faire tout ça pour quelque chose qui devrait être standart!

Merci à tous pour vos commentaires!

# août 28, 2008 15:05

VANNESTE Xavier a dit :

Il y a une facon de faire qui est beaucoup plus SQL Compliant et qui permet d'avoir un clustered index sur une table et pas une vue (beurk un index sur une vue):

http://www.databasejournal.com/features/mssql/article.php/3711501

# août 28, 2008 17:00

loicbar a dit :

Salut Xavier,

Cette solution ne pouvait pas convenir dans mon cas :-(. J'avais également pensé à cette solution! Mais c'est intéressant de le signaler!

# août 28, 2008 17:39

Mimetis a dit :

Désolé pour les liens foireux du premier commentaire.

Je vais la refaire sans tag HTML :)

Le premier ici : http://www.dotmim.com/blogs/mim/archive/2008/02/26/sql-server-2008-filter-index.aspx

Le deuxième ici : http://blog.djeepy1.net/post/2007/10/30/Contrainte-dintegrite-%3A-Unique-ou-NULL

Voilou !

# août 29, 2008 11:08

escalebur a dit :

::: Superbe tuto :::

# octobre 28, 2010 15:20
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- TechDays Paris 2012 : Session pleinière jour 3 par Blog Technique de Romelard Fabrice le il y a 19 heures et 10 minutes

- Mishra Reader : un lecteur RSS très Zune Style en Open Source ! par Cyril Sansus le il y a 21 heures et 43 minutes

- [framework 4] Les Tasks et le Thread UI par Fathi Bellahcene le 02-09-2012, 00:33

- Workflow Foundation 3 a un pied dans la tombe par Blog de Jérémy Jeanson le 02-08-2012, 22:15

- TechDays Paris 2012 : Nouvelles tendances du poste de travail - Bring Your own PC par Blog Technique de Romelard Fabrice le 02-08-2012, 19:42

- TechDays Paris 2012 : System Center Service Manager 2012 Vue d’ensemble par Blog Technique de Romelard Fabrice le 02-08-2012, 17:32

- TechDays Paris 2012 : Pleinière second jour par Blog Technique de Romelard Fabrice le 02-08-2012, 16:23

- TechDays Paris 2012 : Retour d'expérience sur la mise en place d'un Cloud Privé par Blog Technique de Romelard Fabrice le 02-08-2012, 16:04

- TechDays Paris 2012 : Comment SharePoint a sauvé mes TechDays par Blog Technique de Romelard Fabrice le 02-07-2012, 23:59

- Perspective 3.0 pour Silverlight 5.0 par Perspective le 02-07-2012, 22:39