Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Las restricciones UNIQUE y las restricciones CHECK son dos tipos de restricciones que se pueden usar para aplicar la integridad de los datos en tablas de SQL Server. Se trata de objetos de base de datos importantes.
En este tema se incluyen las siguientes secciones.
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 especifican valores duplicados en columnas específicas que no participan en una clave principal. Aunque tanto una restricción UNIQUE como una restricción PRIMARY KEY imponen 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 son la clave principal.
A diferencia de las restricciones PRIMARY KEY, las restricciones UNIQUE permiten el valor NULL. Sin embargo, al igual que con cualquier valor que participa en una restricción UNIQUE, solo se permite un valor NULL por columna. Se puede hacer referencia a una restricción UNIQUE mediante una restricción FOREIGN KEY.
Cuando se agrega una restricción UNIQUE a una columna o columnas existentes de la tabla, de forma predeterminada, el motor de base de datos examina los datos existentes en las columnas para asegurarse de que todos los valores son únicos. Si se agrega una restricción UNIQUE a una columna que tiene 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 aplicar 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 devuelve un mensaje de error que indica que se ha infringido la restricción UNIQUE y no agrega la fila a la tabla. A menos que se especifique explícitamente un índice agrupado, se crea de forma predeterminada un índice único y no clúster para aplicar la restricción UNIQUE.
Restricciones CHECK
Las restricciones CHECK aplican integridad de dominio limitando los valores aceptados por una o varias columnas. Puede crear una restricción CHECK con cualquier expresión lógica (booleana) que devuelva TRUE o FALSE en función de los operadores lógicos. Por ejemplo, el intervalo de valores de una columna de salario se puede limitar mediante la creación de una restricción CHECK que permita solo los datos que van de 15 000 USD a 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 única restricción CHECK a varias columnas si la crea en el nivel de tabla. Por ejemplo, se podría usar una restricción CHECK de varias columnas para confirmar que cualquier fila con un valor de la columna country_region de EE. UU. también tiene un valor de dos caracteres en la columna estado. Así se pueden comprobar varias condiciones en un mismo sitio.
Las restricciones CHECK son similares a las restricciones FOREIGN KEY en que controlan los valores que se colocan en una columna. La diferencia consiste en determinar 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 de una expresión lógica.
Precaución
Las restricciones que incluyen la conversión implícita o explícita de tipos de datos pueden provocar un error en determinadas operaciones. Por ejemplo, dichas restricciones definidas en tablas que son fuentes de conmutación de particiones pueden hacer que falle una operación ALTER TABLE...SWITCH. 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. Dado que los valores NULL se evalúan como UNKNOWN, su presencia en expresiones puede invalidar una restricción. Por ejemplo, supongamos que coloca una restricción en una int
columna 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 a nivel de fila. Si una tabla que acaba de crearse no tiene ninguna fila, cualquier restricción CHECK en 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, dado que no hay filas en la tabla contra las cuales verificar la condición de esta restricción, la instrucción ALTER TABLE tiene éxito.
Las restricciones CHECK no se validan durante las instrucciones DELETE. Por lo tanto, la ejecución de instrucciones DELETE en tablas con determinados tipos de restricciones check puede producir 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.
Tareas relacionadas
Nota:
Si la tabla se publica para la replicación, debe realizar cambios de esquema mediante la instrucción Transact-SQL ALTER TABLE o objetos de administración de SQL Server (SMO). Cuando se realizan cambios de esquema mediante el Diseñador de tablas o el Diseñador de diagramas de base de datos, intenta quitar y volver a crear la tabla. No se pueden quitar objetos publicados, por lo que se producirá un error en el cambio de esquema.
Tarea | Tema |
---|---|
Describe cómo crear una restricción UNIQUE. | Crear restricciones únicas |
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 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 |