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

- Etendre le Team Web Access de TFS 2012 – Step 0 par Philippe Didiergeorges Aka Philess le il y a 20 heures et 27 minutes

- Simuler facilement l’envoi de mail par Blog de Jérémy Jeanson le 05-22-2013, 12:52

- ProcDump 6.0 : support du filtrage sur messages d'exceptions .NET, des filtres multiples et du ciblage par nom de service par CoqBlog le 05-20-2013, 14:50

- Votez pour le TOP 10 des influenceurs SharePoint francophones ! par Le blog de Patrick [MVP SharePoint] le 05-20-2013, 12:59

- [Conf’SharePoint] Dernier rappel ! :-) par Le blog de Patrick [MVP SharePoint] le 05-20-2013, 09:09

- [ #SharePoint 2013 ] les modèles de sites standards… par Le blog de Patrick [MVP SharePoint] le 05-20-2013, 09:03

- 10 erreurs de compréhension concernant SharePoint… par Le blog de Patrick [MVP SharePoint] le 05-20-2013, 08:27

- Conf’SharePoint : 10 bonnes raisons pour ne pas la rater par Le petit blog de Pierre / Pierre's little blog le 05-14-2013, 02:24

- [Event] Soirée de lancement Agile .NET France à Lyon par Blog Agile/ALM de Vincent THAVONEKHAM le 05-13-2013, 01:29

- .NET / Debug : inspection de la mémoire d'applications .NET (dump ou processus live) : première livraison d'une librairie .NET par Microsoft par CoqBlog le 05-11-2013, 22:21