Oltre ai punti in altre risposte, ecco alcune differenze chiave tra i due.
Nota: i messaggi di errore provengono da SQL Server 2012.
Errori
La violazione di un vincolo univoco restituisce l'errore 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 violazione di un indice univoco restituisce l'errore 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.
Disattivazione
Un vincolo univoco non può essere disabilitato.
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.
Ma l'indice univoco dietro un vincolo di chiave primaria o un vincolo univoco può essere disabilitato, così come qualsiasi indice univoco. Hat-tip Brain2000.
ALTER INDEX P1_u ON dbo.P1 DISABLE ;
Si noti il solito avviso che la disabilitazione di un indice cluster rende inaccessibili i dati.
Opzioni
Vincoli univoci supportano opzioni di indicizzazione come FILLFACTOR
e IGNORE_DUP_KEY
, sebbene ciò non sia avvenuto per tutte le versioni di SQL Server.
Colonne incluse
Gli indici non cluster possono includere colonne non indicizzate (definito indice di copertura, questo è un importante miglioramento delle prestazioni). Gli indici dietro i vincoli PRIMARY KEY e UNIQUE non possono includere colonne. Hat-tip @ypercube.
filtraggio
Un vincolo univoco non può essere filtrato.
È possibile filtrare un indice univoco.
CREATE UNIQUE NONCLUSTERED INDEX Students6_DrivesLicence_u
ON dbo.Students6( DriversLicenceNo ) WHERE DriversLicenceNo is not null ;
Vincoli di chiave esterna
Un vincolo di chiave esterna non può fare riferimento a un indice univoco filtrato, sebbene possa fare riferimento a un indice univoco non filtrato (penso che sia stato aggiunto in SQL Server 2005).
Naming
Quando si crea un vincolo, specificare un nome di vincolo è facoltativo (per tutti e cinque i tipi di vincoli). Se non specifichi un nome, MSSQL ne genererà uno per te.
CREATE TABLE dbo.T1 (
TID int not null PRIMARY KEY
) ;
GO
CREATE TABLE dbo.T2 (
TID int not null CONSTRAINT T2_pk PRIMARY KEY
) ;
Durante la creazione di indici, è necessario specificare un nome.
Hat-tip @ i-one.
link
http://technet.microsoft.com/en-us/library/aa224827(v=SQL.80).aspx
http://technet.microsoft.com/en-us/library/ms177456.aspx