Outre les points abordés dans d’autres réponses, voici quelques différences essentielles entre les deux.
Remarque: Les messages d'erreur proviennent de SQL Server 2012.
les erreurs
La violation d'une contrainte unique renvoie l'erreur 2627.
Msg 2627, Level 14, State 1, Line 1
Violation of UNIQUE KEY constraint 'P1U_pk'. Cannot insert duplicate key in object 'dbo.P1U'. The duplicate key value is (1).
The statement has been terminated.
La violation d'un index unique renvoie l'erreur 2601.
Msg 2601, Level 14, State 1, Line 1
Cannot insert duplicate key row in object 'dbo.P1' with unique index 'P1_u'. The duplicate key value is (1).
The statement has been terminated.
Désactiver
Une contrainte unique ne peut pas être désactivée.
Msg 11415, Level 16, State 1, Line 1
Object 'P1U_pk' cannot be disabled or enabled. This action applies only to foreign key and check constraints.
Msg 4916, Level 16, State 0, Line 1
Could not enable or disable the constraint. See previous errors.
Mais l'index unique derrière une contrainte de clé primaire ou une contrainte unique peut être désactivé, de même que tout index unique. Pointe du chapeau Brain2000.
ALTER INDEX P1_u ON dbo.P1 DISABLE ;
Notez l'avertissement habituel selon lequel la désactivation d'un index en cluster rend les données inaccessibles.
Les options
Des contraintes uniques prennent en charge des options d'indexation telles que FILLFACTOR
et IGNORE_DUP_KEY
, bien que cela n'ait pas été le cas pour toutes les versions de SQL Server.
Colonnes Incluses
Les index non clusterisés peuvent inclure des colonnes non indexées (appelé index couvrant, il s'agit d'une amélioration majeure des performances). Les index derrière les contraintes PRIMARY KEY et UNIQUE ne peuvent pas inclure de colonnes. Hat-tip @ypercube.
Filtration
Une contrainte unique ne peut pas être filtrée.
Un index unique peut être filtré.
CREATE UNIQUE NONCLUSTERED INDEX Students6_DrivesLicence_u
ON dbo.Students6( DriversLicenceNo ) WHERE DriversLicenceNo is not null ;
Contraintes de clé étrangère
Une contrainte de clé étrangère ne peut pas référencer un index unique filtré, bien qu'elle puisse référencer un index unique non filtré (je pense que cela a été ajouté dans SQL Server 2005).
Appellation
Lors de la création d'une contrainte, la spécification d'un nom de contrainte est facultative (pour les cinq types de contraintes). Si vous ne spécifiez pas de nom, MSSQL en générera un pour vous.
CREATE TABLE dbo.T1 (
TID int not null PRIMARY KEY
) ;
GO
CREATE TABLE dbo.T2 (
TID int not null CONSTRAINT T2_pk PRIMARY KEY
) ;
Lors de la création d'index, vous devez spécifier un nom.
Chapeau-pointe @ i-one.
Liens
http://technet.microsoft.com/en-us/library/aa224827(v=SQL.80).aspx
http://technet.microsoft.com/en-us/library/ms177456.aspx