Restricciones UNIQUE y CHECK
Se aplica a: SQL Server
Azure SQL Database
Azure SQL Managed Instance
Las restricciones UNIQUE
y CHECK
son dos tipos de restricciones que se pueden utilizar para reforzar la integridad de los datos en las tablas de SQL Server. Se trata de objetos de base de datos importantes.
Este artículo contiene las secciones siguientes.
Restricciones UNIQUE
Las restricciones son reglas que el motor de base de datos de SQL Server exige. Por ejemplo, puede usar restricciones UNIQUE
para asegurarse de que no se introducen valores duplicados en columnas específicas que no participan en una clave primaria. Aunque tanto una restricción UNIQUE
como una restricción PRIMARY KEY
imponen la unicidad, use una restricción UNIQUE
en lugar de una restricción PRIMARY KEY
cuando quiera imponer la unicidad de una columna (o combinación de columnas) que no sea la clave principal.
A diferencia de las restricciones PRIMARY KEY
las restricciones UNIQUE
permiten valores NULL
. Sin embargo, de la misma forma que cualquier valor incluido en una restricción UNIQUE
, solo se admite un valor NULL por columna. Es posible hacer referencia a una restricción UNIQUE
con una restricción FOREIGN KEY
.
Cuando se agrega una restricción UNIQUE
a una o varias columnas de la tabla, de manera predeterminada, el Motor de base de datos examina los datos existentes en las columnas para garantizar que todos los valores sean únicos. Si se agrega una restricción UNIQUE
a una columna que contiene valores duplicados, el Motor de base de datos devuelve un error y no agrega la restricción.
El Motor de base de datos crea automáticamente un índice UNIQUE
para exigir el requisito de unicidad de la restricción UNIQUE
. Por lo tanto, si se intenta insertar una fila duplicada, el Motor de base de datos devolverá un mensaje de error para indicar que se infringió la restricción UNIQUE
y no se agregará la fila a la tabla. A menos que se especifique explícitamente un índice clúster, se creará de manera predeterminada un índice no clúster único, para exigir la restricción UNIQUE
.
restricciones CHECK
Las restricciones CHECK
exigen la integridad del dominio mediante la limitación de los valores que puede aceptar una o varias columnas. Puede crear una restricción CHECK
con cualquier expresión lógica (booleana) que devuelva TRUE
o FALSE
basándose en operadores lógicos. Por ejemplo, es posible limitar el intervalo de valores para una columna salary
creando una restricción CHECK
que solo permita datos entre 15 000 y 100 000 USD. Esto evita que los salarios caigan fuera del intervalo de salario normal. La expresión lógica sería la siguiente: salary >= 15000 AND salary <= 100000
.
Puede aplicar varias restricciones CHECK
a una sola columna. También puede aplicar una sola restricción CHECK
a varias columnas si se crea en el nivel de la tabla. Por ejemplo, una restricción CHECK
para varias columnas se podría usar para confirmar que cualquier fila con un valor country_region
en la columna USA
tiene también un valor de dos caracteres en la columna state
. Así se pueden comprobar varias condiciones en un mismo sitio.
Las restricciones CHECK
son similares a las restricciones FOREIGN KEY
porque controlan los valores que se colocan en una columna. La diferencia reside en la forma en que determinan qué valores son válidos: las restricciones FOREIGN KEY
obtienen la lista de valores válidos de otra tabla, mientras que las restricciones CHECK
determinan los valores válidos a partir de una expresión lógica.
Precaución
Las restricciones que incluyen la conversión de tipos de datos implícitos o explícitos pueden impedir la correcta ejecución de determinadas operaciones. Por ejemplo, las restricciones definidas en tablas que son orígenes de un cambio de partición pueden impedir que una operación ALTER TABLE...SWITCH
se realice correctamente. Evite la conversión de tipos de datos en las definiciones de las restricciones.
Limitaciones de las restricciones CHECK
Las restricciones CHECK
rechazan los valores que se evalúan como FALSE
. Puesto que los valores nulos se evalúan como UNKNOWN, su presencia en las expresiones puede reemplazar una restricción. Por ejemplo, supongamos que define una restricción para una columna int MyColumn
, que especifica que MyColumn
solo puede contener el valor 10 (MyColumn=10
). Si inserta el valor NULL
en MyColumn
, el Motor de base de datos inserta NULL
y no devuelve un error.
Una restricción CHECK
devuelve TRUE
cuando la condición que está comprobando no es FALSE
para ninguna fila de la tabla. Una restricción CHECK
opera en el nivel de fila. Si una tabla creada no tiene filas, cualquier restricción CHECK
sobre esta tabla se considera válida. Esta situación puede generar resultados inesperados, como en el siguiente ejemplo.
CREATE TABLE CheckTbl (col1 INT, col2 INT);
GO
CREATE FUNCTION CheckFnctn()
RETURNS INT
AS
BEGIN
DECLARE @retval INT;
SELECT @retval = COUNT(*)
FROM CheckTbl;
RETURN @retval;
END;
GO
ALTER TABLE CheckTbl ADD CONSTRAINT chkRowCount CHECK (dbo.CheckFnctn() >= 1);
GO
La restricción CHECK
que se agrega especifica que como mínimo debe existir una fila en la tabla CheckTbl
. Sin embargo, puesto que no hay filas en la tabla contra la que se comprueba la condición de esta restricción, la instrucción ALTER TABLE
será correcta.
Las restricciones CHECK
no se validan durante las instrucciones DELETE
. Por lo tanto, la ejecución de instrucciones DELETE
en las tablas con ciertos tipos de restricciones CHECK puede generar resultados inesperados. Por ejemplo, imaginemos que las siguientes instrucciones se ejecutan en la tabla CheckTbl
.
INSERT INTO CheckTbl VALUES (10, 10);
GO
DELETE CheckTbl WHERE col1 = 10;
La instrucción DELETE
será correcta aunque la restricción CHECK
especifique que la tabla CheckTbl
debe tener al menos 1
fila.
Nota:
Si se publica la tabla para la replicación, debe modificar el esquema mediante la instrucción Transact-SQL ALTER TABLE u Objetos de administración de SQL Server (SMO). Si se modifica el esquema mediante el Diseñador de tablas o el Diseñador de diagramas de base de datos, se intentará eliminar la tabla y volver a crearla. No se pueden eliminar objetos publicados, por lo que la modificación del esquema generará un error.
Tareas relacionadas
Tarea | Artículo |
---|---|
Describe cómo crear una restricción UNIQUE. | Crear restricciones UNIQUE |
Describe cómo modificar una restricción UNIQUE. | Modificar restricciones UNIQUE |
Describe cómo eliminar una restricción UNIQUE. | Eliminar restricciones UNIQUE |
Describe cómo crear una restricción CHECK. | Crear restricciones CHECK |
Describe cómo deshabilitar una restricción CHECK cuando un agente de replicación inserta o actualiza datos en una tabla. | Deshabilitar restricciones CHECK para la replicación |
Describe cómo deshabilitar una restricción CHECK al agregar, actualizar o eliminar datos en una tabla. | Deshabilitar restricciones CHECK con instrucciones INSERT y UPDATE |
Describe cómo cambiar la expresión de restricción o las opciones que la habilitan o deshabilitan en condiciones específicas. | Modificar restricciones CHECK |
Describe cómo eliminar una restricción CHECK. | Eliminar restricciones CHECK |
Describe cómo ver las propiedades de una restricción CHECK. | Restricciones UNIQUE y restricciones CHECK |