Une clé est juste un indice normal. Un chemin sur la simplification est de la penser comme une carte de catalogue à la bibliothèque. C'points de MySQL dans la bonne direction.
Une clé unique est également utilisé pour améliorer la recherche de vitesse, mais il a la contrainte qu'il n'existe pas d'éléments dupliqués (il n'y a pas deux x et y où x n'est pas y et x == y).
Le manuel explique comme suit:
Un index UNIQUE crée une contrainte telle que toutes les valeurs de l'indice
doivent être distinctes. Une erreur se produit si vous essayez d'ajouter une nouvelle ligne avec un
valeur de la clé qui correspond à une ligne existante. Cette contrainte ne s'applique pas
pour les valeurs NULL, sauf pour la BDB moteur de stockage. Pour les autres moteurs, un
Index UNIQUE permet à plusieurs valeurs NULL pour les colonnes qui peuvent contenir
La valeur NULL. Si vous spécifiez une valeur de préfixe pour une colonne dans un index UNIQUE,
les valeurs de la colonne doit être unique dans le préfixe.
Une clé primaire est un "spécial" clé unique. C'est fondamentalement une clé unique, sauf que c'est utilisé pour identifier quelque chose.
Le manuel explique comment les index sont utilisés en général: ici.
En MSSQL, les concepts sont similaires. Il y a des indices, des contraintes uniques et des clés primaires.
Pas testé, mais je crois que la MSSQL équivalent est:
CREATE TABLE tmp (
id int NOT NULL PRIMARY KEY IDENTITY,
uid varchar(255) NOT NULL CONSTRAINT uid_unique UNIQUE,
name varchar(255) NOT NULL,
tag int NOT NULL DEFAULT 0,
description varchar(255),
);
CREATE INDEX idx_name ON tmp (name);
CREATE INDEX idx_tag ON tmp (tag);
Edit: le code ci-dessus est testé pour être correcte; toutefois, je soupçonne qu'il y a une bien meilleure syntaxe pour le faire. Été un moment depuis que j'ai utilisé SQL server, et apparemment j'ai oublié un peu :).