51 votes

Quelle est la différence entre une clé unique et un index avec IsUnique=Yes ?

J'ai une table avec une clé primaire, mais je veux que deux autres colonnes soient contraintes pour que la combinaison des deux soit toujours garantie comme unique.

(un exemple stupide : Dans une table BOOKS, la colonne IBAN est la clé primaire, mais la combinaison des colonnes Title et Author doit aussi toujours être unique).

Dans le Management Studio du serveur SQL, il est possible de créer un nouvel index et de définir IsUnique sur Oui, ou de créer une nouvelle clé unique.

Quelle est la différence entre les deux approches, et laquelle convient le mieux à quels objectifs ?

5 votes

Juste au cas où cela serait pertinent : si vous avez besoin de permettre à plusieurs lignes d'être NULL mais que toutes les lignes non NULL doivent être UNIQUES : soit vous imposez cela avec un Trigger, soit une VUE avec un INDEX UNIQUE - CREATE VIEW xxx AS SELECT Title, Author FROM Books WHERE (Title + Author) IS NOT NULL puis créez un index sur cette vue.

0 votes

Merci Kirsten, c'était une information utile !

1 votes

35voto

Tony Andrews Points 67363

La création d'une contrainte UNIQUE est un énoncé plus clair de la règle. L'attribut IsUnique de l'index est un détail d'implémentation. comment la règle est appliquée, et non ce que la règle est. Mais l'effet est le même.

1 votes

@pylover : dans certains cas, une contrainte (par exemple une clé étrangère ou not null) peut améliorer les performances en donnant à l'optimiseur des informations utiles dont il ne disposerait pas autrement. Dans le cas de l'unicité, j'imagine qu'il n'y a pas de différence entre une contrainte et un simple index, mais je ne suis pas sûr à 100%.

8voto

Il y a une nette différence entre les deux. Une contrainte unique définit quelle combinaison de colonnes doit être unique. Un index unique est juste un moyen de s'assurer que ce qui précède est toujours valide. Mais il est possible d'avoir un index non-unique supportant une contrainte unique. (si la contrainte est différée = elle ne doit être valide qu'au moment de la validation mais peut être rompue au milieu d'une transaction).

6voto

SQLMenace Points 68670

Pour votre information, lorsque vous créez une contrainte unique, le serveur SQL crée un index en coulisse.

4voto

Tod Points 3501

Une chose que je viens de découvrir à la dure, c'est que dans SSMS, le scripting des clés uniques était défini par défaut sur true (vrai), mais le scripting des indices était défini sur false (faux). Lorsque j'ai utilisé le menu contextuel script Table As de SSMS, je n'ai pas obtenu mes indices uniques.

De même, si le type est défini sur Clé unique, vous ne pouvez pas modifier le paramètre "Ignorer les clés dupliquées". Vous devez d'abord changer le type de Clé unique en Index, puis vous pouvez définir Ignorer les clés dupliquées sur vrai.

0voto

Bibash Adhikari Points 53

Je ne pense pas qu'il y ait de différence entre eux mais en utilisant l'index unique, nous pouvons avoir deux avantages, car la colonne est déjà unique et a également l'index sur elle donc je vais être plus rapide à rechercher. L'utilisation de l'index unique est donc plus avantageuse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X