Pregunta

Cuando quiero una columna de tener valores distintos, puedo usar ya sea una restricción

create table t1(
id int primary key,
code varchar(10) unique NULL
);
go

o puedo usar un índice único

create table t2(
id int primary key,
code varchar(10) NULL
);
go

create unique index I_t2 on t2(code);

Las columnas con restricciones únicas parecen ser buenos candidatos para los índices únicos.

¿Hay alguna razón conocida la utilización de restricciones únicas y no utilizar índices únicos en su lugar?

¿Fue útil?

Solución

Bajo el capó una restricción única se lleva a cabo del mismo modo que un índice único - se necesita un índice para cumplir de manera eficiente con el requisito de hacer cumplir la restricción. Incluso si el índice se crea como resultado de una restricción UNIQUE, el planificador de consultas puede utilizar como cualquier otro índice si lo ve como la mejor manera de acercarse a una determinada consulta.

Así que para una base de datos que soporta tanto ofrece la elección de cuál utilizar a menudo llegado hasta el estilo preferido y consistencia.

Si usted está planeando utilizar el índice como un índice (es decir, su código puede depender de búsqueda / clasificación / filtrado en ese campo para ser rápido) Me gustaría utilizar explícitamente un índice único (y comentar la fuente) en lugar de una restricción que esto quede claro - de esta manera si el requisito de exclusividad se cambia en una revisión posterior de la aplicación que (o algún otro codificador) sabrá que tiene que asegurarse de que un índice no único se pone en lugar del único (sólo la eliminación de un único restricción eliminaría el índice completamente). También un índice específico puede ser nombrado en una sugerencia de índice (es decir, con (INDICE (ix_index_name)), que no creo que es el caso para el índice creado detrás de las escenas de la gestión de singularidad como es poco probable que conocer su nombre.

Del mismo modo, si sólo se está necesitando para hacer cumplir singularidad como una regla de negocio en lugar del campo que necesita ser buscado o el programa usado para clasificar a continuación, que haría uso de la restricción, de nuevo para el uso previsto más evidente cuando alguien mira a su tabla de definición.

Tenga en cuenta que si utiliza tanto una restricción única y un índice único en el mismo campo de la base de datos no será lo suficientemente brillante para ver la duplicación, por lo que el resultado final será con dos índices que van a consumir más espacio y lentos inserciones de fila hacia abajo / actualizaciones.

Otros consejos

Además de los puntos en otras respuestas, aquí hay algunas diferencias clave entre los dos.

Nota:. Los mensajes de error son de SQL Server 2012

Errores

Violación de un error de los retornos restricción única 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.

Violación de un error de la rentabilidad del índice único de 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.

Desactivación

Una restricción única no puede ser desactivada.

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.

Sin embargo, el índice único detrás de una restricción de clave primaria o una restricción única se puede desactivar, al igual que cualquier índice único. Sombrero de punta Brain2000.

ALTER INDEX P1_u ON dbo.P1 DISABLE ;

Tenga en cuenta la advertencia habitual que al desactivar un índice agrupado hace lo inaccesible de datos.

Opciones

Las restricciones de unicidad apoyan opciones como FILLFACTOR y IGNORE_DUP_KEY indexación, aunque esto no ha sido el caso para cada versiones de SQL Server.

Columnas incluidas

Los índices no agrupados pueden incluir columnas no indexadas (denominado un índice de cobertura, esta es una importante mejora del rendimiento). Los índices detrás PRIMARY KEY y UNIQUE no pueden incluir columnas. Sombrero de punta @ypercube.

Filtrado

restricción A Unique no puede ser filtrada.

A índice único puede ser filtrada.

CREATE UNIQUE NONCLUSTERED INDEX Students6_DrivesLicence_u 
ON dbo.Students6( DriversLicenceNo ) WHERE DriversLicenceNo is not null ;

restricciones de clave externa

Una restricción de clave externa no puede hacer referencia a un índice único filtrada, aunque se puede hacer referencia a un índice no filtrada única (creo que esto se añadió en SQL Server 2005).

Naming

Al crear limitación, especificando un nombre de restricción es opcional (para los cinco tipos de restricciones). Si no se especifica un nombre a continuación, MSSQL generará una para ti.

CREATE TABLE dbo.T1 (
    TID int not null PRIMARY KEY
) ;
GO
CREATE TABLE dbo.T2 (
    TID int not null CONSTRAINT T2_pk PRIMARY KEY
) ;

Cuando la creación de índices, debe especificar un nombre.

Hat-tip @ i-uno.

Enlaces

http://technet.microsoft.com /en-us/library/aa224827(v=SQL.80).aspx

http://technet.microsoft.com/en-us/library/ ms177456.aspx

Para citar MSDN como una fuente autorizada:

No existen diferencias significativas entre la creación de una restricción UNIQUE y la creación de un índice único que es independiente de una restricción . La validación de datos se produce de la misma manera, y el optimizador de consultas no diferencia entre un índice único creado por una restricción o creados manualmente. Sin embargo, crear una restricción UNIQUE en la columna hace que el objetivo del índice claro ... más información aquí

Y ...

El motor de base crea automáticamente un índice único para cumplir el carácter único requisito de la restricción UNIQUE. Por lo tanto, si una intente insertar una fila duplicada está hecho, los rendimientos del motor de base de datos un mensaje de error que indica la restricción UNIQUE ha sido violada y no añade la fila a la tabla. A menos que un índice agrupado es especifique explícitamente, un índice único, no agrupado se crea por defecto para hacer cumplir la restricción UNIQUE ... más información aquí

Otros en: https: // TechNet .microsoft.com / es-es / library / aa224827% 28v% = sql.80 29.aspx

Una de las principales diferencias entre una restricción única y un índice único es que una restricción de clave externa en otra mesa se puede hacer referencia a columnas que componen una restricción única. Esto no es cierto para los índices únicos. Además, restricciones únicas se definen como parte del estándar ANSI, mientras que los índices no lo son. Finalmente, restricción única en considera que viven en el campo del diseño base de datos lógica (que puede ser implementado de manera diferente por diferentes motores dB) mientras que el índice es de aspecto físico. Por lo tanto, restricción única es más declarativa. Yo prefiero restricción única en casi todos los casos.

En Oracle una diferencia importante es que se puede crear un índice de función única, que no es factible con restricciones únicas:

Por ejemplo

create unique index ux_test on my_table (case when amount != 0 then fk_xyz end);

Así fk_xyz sólo es único para el registro que tiene amount != 0.

restricción UNIQUE se prefiere sobre el índice único. Cuando la restricción no es aplicable sólo tiene que utilizar un índice único regular o no. Constraint es también otro tipo de índice. El índice se utiliza para un acceso más rápido.

índices únicos pueden tener cláusulas donde. Por ejemplo, puede crear índices para cada año con base en la columna de la fecha

WHERE Sale_Date BETWEEN '2012-01-01' AND '2012-12-31'
Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top