Argument UNIQUE pour la création d'INDEX – pour quoi faire?

Pourquoi l'instruction de création INDEX a-t-elle un argument UNIQUE?

Si je comprends bien, l'index non-cluster contient un signet, un pointeur sur une ligne, qui devrait être unique pour distinguer même les lignes non-uniques,
afin d'assurer que l'index non clusterisé soit unique?
Correct?

Donc, est-ce que je comprends que l'index non-unique peut être seulement sur la table groupée? depuis

  • "Un index clusterisé sur une vue doit être unique" [1]

Puisque "Le niveau inférieur ou feuille, de l'index clusterisé contient les lignes de données réelles de la table" [1], dois-je comprendre que le même effet que UNIUE sur l'index cluster peut être obtenu par contrainte unique sur (éventuellement partie de) colonnes d'une table [2]?

Alors, qu'est-ce que l'argument UNIQUE pour index?
sauf confusion aux concepts de base définitions [3]


Mettre à jour:
C'est encore le même piège – expliquant quelque chose déjà expliqué plusieurs fois basé sur des termes indéfinis convertissant toute explication en jeu de devinettes sans fin.
S'il vous plaît voir ma sous-question [4] qui est vraiment re-formulation de cette même question ici.


Update2:
Le problème est ambigu, manque de définitions ou de mauvaise utilisation des termes dans des contexts inappropriés. Si l'index est défini comme une structure servant à (find et) identifier / pointer vers des données réelles, alors les index non uniques ou NULL n'ont aucun sens. Au revoir


Cité:
[1]
CREATE INDEX (Transact-SQL)
http://msdn.microsoft.com/en-us/library/ms188783.aspx

[2]
CREATE TABLE (Transact-SQL) http://msdn.microsoft.com/fr-fr/library/ms174979.aspx

[3]
Index unique ou key unique?
Index unique ou key unique?

[4]
Qu'est-ce que l'index et l'index non clusterisé peut-il être non unique?
Qu'est-ce que l'index et l'index non clusterisé peut-il être non unique?

La clause d'index UNIQUE est vraiment juste une syntaxe de SQL Server et d'autres SGBD. En SQL standard, les contraintes d'unicité sont implémentées par l'utilisation de la syntaxe PRIMARY KEY et UNIQUE CONSTRAINT, et non par le biais d'index (il n'y a pas d'index en SQL standard).

Le mécanisme que SQL Server utilise en interne pour implémenter les contraintes d'unicité s'appelle un index unique. Un index unique est créé automatiquement pour vous chaque fois que vous créez une contrainte PRIMARY KEY ou UNIQUE. Pour des raisons mieux connues de l'équipe de développement de SQL Server, ils ont décidé d'exposer le mot-key UNIQUE dans le cadre de la syntaxe CREATE INDEX, même si la syntaxe de contrainte fait le même travail.

Dans l'intérêt de la clarté et de la prise en charge des normes, je vous recommand de ne pas créer explicitement des index UNIQUES dans la mesure du possible. Utilisez plutôt la syntaxe de la contrainte PRIMARY KEY ou UNQIUE.

Bien qu'un index non unique soit suffisant pour faire la distinction entre les lignes (comme vous l'avez dit), l'index UNIQUE sert de contrainte: il empêchera la saisie de duplicates dans la database – où les "duplicates" sont des lignes contenant les mêmes données. colonnes.

Exemple:

  Firstname | Lastname | Login ================================ Joe | Smith | joes Joe | Taylor | joet Susan | Smith | susans 

Supposons que les noms de connection sont générés par défaut à partir du prénom + la première lettre du nom de famille.

Que se passe-t-il lorsque nous essayons d'append Joe Sciavillo à la database? Normalement, le système générerait heureusement le nom de connection joes et l'insert (Joe,Sciavillo,joes) . Maintenant, nous aurions deux users avec le même nom d'user – probablement une mauvaise chose.

Maintenant, disons que nous avons un index UNIQUE sur la colonne Login – la database vérifiera qu'aucune autre ligne avec les mêmes données n'existe déjà, avant qu'elle n'insère la nouvelle ligne. En d'autres termes, la tentative d'insertion d'un autre joes sera rejetée, car ces données ne seraient plus uniques sur cette ligne.

Bien sûr, vous pourriez avoir des index uniques sur plusieurs colonnes, auquel cas la combinaison de données devrait être unique (par exemple un index unique sur Firstname,Lastname acceptera volontiers une ligne avec (Joe,Badzhanov) , car la combinaison n'est pas dans la table encore, mais rejetter une deuxième rangée avec (Joe,Smith) )

La clause UNIQUE spécifie que les valeurs dans la colonne (s) doivent être uniques dans la table, en ajoutant essentiellement une contrainte unique. Un index clusterisé sur une table spécifie que l'ordre des lignes dans la table sera le même que l'index. Un index non clusterisé ne modifie pas l'ordre physique, ce qui explique pourquoi il est préférable d'avoir plusieurs index cluster non clusterisés mais un seul cluster. Vous pouvez avoir des index clusterisés et non-cluster uniques ou non-uniques sur une table.

Je pense que la question sous-jacente est: quelle est la différence entre les index uniques et non-uniques?

La réponse est que les inputs dans les index uniques peuvent chacune pointer vers une seule ligne, alors que les inputs dans les index non uniques peuvent pointer vers plusieurs lignes.

Par exemple, considérons une table d'articles de command:

 ORDER_NO INTEGER LINE_NO INTEGER PRODUCT_NO INTEGER QUANTITY DECIMAL 

– avec un index unique sur ORDER_NO et LINE_NO, et un index non unique sur PRODUCT_NO.

Pour une seule combinaison de ORDER_NO et LINE_NO, il ne peut y avoir qu'une input dans la table, alors que pour une seule valeur de PRODUCT_NO, il peut y avoir plusieurs inputs dans la table (car il y aura beaucoup d'inputs pour cette valeur dans l'index).