sql >> Base de Datos >  >> RDS >> Sqlserver

Información sobre las restricciones únicas de SQL Server

¿Qué son las restricciones clave únicas?

Una restricción única es una regla que restringe las entradas de columna a únicas. En otras palabras, este tipo de restricciones impide insertar duplicados en una columna. Una restricción única es uno de los instrumentos para hacer cumplir la integridad de los datos en una base de datos de SQL Server. Dado que una tabla solo puede tener una clave principal, puede usar una restricción única para imponer la unicidad de una columna o una combinación de columnas que no constituyen una clave principal.

Crear una restricción única en una columna crea automáticamente un índice único. De esta forma, SQL Server implementa el requisito de integridad de la restricción única. Por lo tanto, al intentar insertar un valor duplicado en una columna en la que se define una restricción única, el Motor de base de datos detectará la infracción de la restricción única y emitirá el error correspondiente. Como resultado, la fila con los valores duplicados no se agregará a la tabla.

Crear una restricción única

La siguiente consulta de ejemplo crea los Estudiantes tabla y una restricción única en el Inicio de sesión columna para que no haya estudiantes con el mismo inicio de sesión.

CREATE TABLE Students (
Login CHAR NOT NULL
,CONSTRAINT AK_Student_Login UNIQUE (Login)
);
GO

Si los Estudiantes la tabla ya existe, entonces puede usar la siguiente consulta de muestra para crear la restricción única.

ALTER TABLE Students
ADD CONSTRAINT AK_Student_Login UNIQUE (Login);
GO

Tenga en cuenta que cuando agrega una restricción única a una tabla existente, el Motor de base de datos verifica si la columna a la que se agrega la restricción incluye valores duplicados. Si existen tales valores, la restricción no se agregará y devolverá un error.

Ahora, para verificar que la restricción única se haya agregado realmente, ejecute las siguientes instrucciones:

EXEC sp_helpindex Students

EXEC sp_helpconstraint Students

Esta es la restricción que hemos creado:

Creación de una restricción única en SQL Server Management Studio

Digamos que necesitamos definir una restricción única en el Inicio de sesión columna los Estudiantes mesa.

1. En el Explorador de objetos , haga clic con el botón derecho en Estudiantes tabla y haga clic en Diseño .

2. Haga clic derecho en el Diseñador de tablas y elija Índices/Claves…

3. En los Índices/Claves ventana, haga clic en Agregar .

4. Bajo el General sección, haga clic en Columnas y luego haga clic en el botón de puntos suspensivos. En las columnas de índice ventana, seleccione la(s) columna(s) que desea incluir en la restricción única.

5. Bajo el General sección, haga clic en Escribir y seleccione Clave única de la lista desplegable.

6. Bajo la Identidad sección, especifique el nombre de la restricción (en nuestro caso, AK_Student_Login ) y haga clic en Cerrar para guardar la restricción recién creada.

Ahora, si vas a Estudiantes tabla en Explorador de objetos y haga clic en Índices carpeta, verá que la tabla contiene una clave principal y una restricción única AK_Student_Login .

¿En qué se diferencian las restricciones únicas de las claves primarias?

Similar a una restricción única, una clave principal también se usa para imponer la integridad de los datos en una tabla. Pero el propósito principal de una clave principal es identificar de manera única cada registro en una tabla e implementar relaciones adecuadas entre tablas en una base de datos. Se requiere una clave principal en el 99% de las tablas para permitir el acceso adecuado a las filas de la tabla. Solo puede haber una clave principal por tabla definida en una o más columnas.

Las restricciones únicas se usan específicamente para evitar que se inserten valores duplicados en una columna. Puede haber varias columnas con restricciones únicas o puede que no haya restricciones únicas definidas en una tabla. No son obligatorias para una tabla a diferencia de las claves principales.

Digamos que tenemos los Estudiantes tabla que contiene información personal sobre cada estudiante en una universidad. La tabla incluye el StudentID columna que es una clave principal y almacena una identificación única de cada estudiante específico. Esta columna de clave principal se usa para identificar de manera única a cada estudiante en una universidad.

Al mismo tiempo, los Estudiantes la tabla tiene columnas como Correo electrónico , Número de Seguro Social y Iniciar sesión y cada una de estas columnas debe almacenar valores únicos. Dado que ya hay una clave principal en la tabla, utilizaremos restricciones únicas para imponer unicidad a estas columnas. Por lo tanto, una tabla puede tener muchas restricciones únicas y solo una clave principal.

Otra cosa que diferencia una restricción única de una clave principal es que la clave principal no permite ningún NULL valores en una columna, mientras que una columna con una restricción única puede incluir un NULL valor pero solo uno ya que SQL Server interpreta dos valores NULL como los mismos valores.

Supongamos que se crea una restricción única en el Correo electrónico columna de los Estudiantes mesa. Intentemos insertar dos filas ambas con NULL s en el Correo electrónico campos:

INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)

VALUES (1, 'John White', 19, NULL, 123-45-6789, 'John555')

GO
INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)

VALUES (2, 'James Marvin', 21, NULL, 987-65-4321, 'Marvin_J17')

GO

Recibimos el siguiente mensaje de error:

Bueno, este es un comportamiento predecible, porque los valores duplicados, incluso si son NULL, no están permitidos por la restricción única.

Restricción única frente a índice único

Aunque tanto la restricción única como el índice único son dos entidades de base de datos completamente diferentes y no relacionadas, tienen el mismo objetivo y el mismo impacto en el rendimiento de SQL Server. Ambos aseguran la unicidad de los datos en una columna.

Sin embargo, a diferencia del índice único, no puede especificar las opciones IGNORE_DUP_KEY, DROP_EXISTING, PAD_INDEX y STATISTICS_NORECOMPUTE para la restricción única en las sentencias ALTER TABLE.

Cuando crea una restricción única en una columna, SQL Server crea automáticamente un índice único en la columna, así es como se implementa esta característica en SQL Server.

Para eliminar el índice único, primero debe eliminar la restricción única correspondiente y esto eliminará automáticamente el índice único subyacente.

La siguiente declaración eliminará el AK_Student_Login restricción:

ALTER TABLE Students 
DROP CONSTRAINT AK_Student_Login; 
GO

Puede ver que al soltar el AK_Student_Login la restricción única elimina su índice correspondiente.

Eso fue fácil, ahora puede insertar valores idénticos en el Iniciar sesión columna.

Deshabilitar restricción única

Hay una opción que deshabilita una restricción única. Se supone que la siguiente consulta deshabilita todas las restricciones de la tabla:

ALTER TABLE Students
NOCHECK CONSTRAINT ALL
GO

Habiendo ejecutado la consulta, ahora intentemos insertar un registro duplicado:

INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)
VALUES (3, 'John White', 19, NULL, 123-45-6789, 'John555')
GO

Lo que obtenemos es el mensaje de violación de restricción única:

Por lo tanto, parece que ALTER TABLE

NOCHECK CONSTRAINT ALL GO no funciona para restricciones únicas en SQL Server.

Sin embargo, recuerde que hay un índice único bajo el capó de cada restricción única, y deberíamos poder deshabilitar un índice único. En nuestro caso, el AK_Student_Email la restricción única ha creado el AK_Student_Email correspondiente índice único en el Correo electrónico columna. Usemos la siguiente consulta para deshabilitar el AK_Student_Email índice único primero.

ALTER INDEX AK_Student_Email ON Students
DISABLE;

La consulta se completó con éxito, así que ahora insertemos dos registros con Correo electrónico duplicado campos en los Estudiantes mesa.

INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)
VALUES (3, 'John White', 19, '[email protected]', 123-45-6789, 'John555')
GO
INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)
VALUES (4, 'James Marvin', 21, '[email protected]', 987-65-4321, 'Marvin_J17')
GO

¡Funciona! ¡Los registros se han insertado en la tabla! Ahora sabemos cómo sortear este problema de "inhabilitación" con una restricción única.

Para habilitar el índice, utilice la siguiente consulta:

ALTER INDEX AK_Student_Email ON Students
REBUILD;

Conclusión

Las restricciones clave únicas permiten a los desarrolladores de DBA y SQL aplicar y preservar la unicidad de los datos en las columnas de la tabla, así como aplicar ciertos requisitos comerciales para la integridad de los datos. Básicamente, no hay una diferencia sustancial en el comportamiento entre una restricción única y un índice único, excepto el hecho de que la restricción única no se puede deshabilitar directamente y ciertas opciones de creación de índices no están disponibles para restricciones únicas en la sentencia ALTER TABLE.

Espero que este artículo haya sido interesante. Puede hacer preguntas, dejar comentarios y sugerencias sobre este artículo.

Ver también: CHECK Restricciones en SQL Server