Restricciones UNIQUE y restricciones CHECKUnique Constraints and Check Constraints

ESTE TEMA SE APLICA A:síSQL Server (a partir de 2008)síAzure SQL DatabasenoAzure SQL Data Warehouse noAlmacenamiento de datos paralelos THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Las restricciones UNIQUE y las restricciones CHECK son dos tipos de restricciones que se pueden usar para exigir la integridad de los datos en las tablas de SQL ServerSQL Server .UNIQUE constraints and CHECK constraints are two types of constraints that can be used to enforce data integrity in SQL ServerSQL Server tables. Se trata de objetos de base de datos importantes.These are important database objects.

Este tema contiene las siguientes secciones.This topic contains the following sections.

Restricciones UNIQUEUNIQUE Constraints

Restricciones CHECKCHECK Constraints

Tareas relacionadasRelated Tasks

Restricciones UNIQUEUNIQUE Constraints

Las restricciones son reglas que Motor de base de datos de SQL ServerSQL Server Database Engine aplica de forma automática.Constraints are rules that the Motor de base de datos de SQL ServerSQL Server Database Engine enforces for you. Por ejemplo, puede usar restricciones UNIQUE para garantizar que no se escriben valores duplicados en columnas específicas que no forman parte de una clave principal.For example, you can use UNIQUE constraints to make sure that no duplicate values are entered in specific columns that do not participate in a primary key. Tanto la restricción UNIQUE como la restricción PRIMARY KEY exigen la unicidad; sin embargo, debe usar la restricción UNIQUE y no PRIMARY KEY si desea exigir la unicidad de una columna o una combinación de columnas que no forman la clave principal.Although both a UNIQUE constraint and a PRIMARY KEY constraint enforce uniqueness, use a UNIQUE constraint instead of a PRIMARY KEY constraint when you want to enforce the uniqueness of a column, or combination of columns, that is not the primary key.

A diferencia de las restricciones PRIMARY KEY, las restricciones UNIQUE permiten valores NULL.Unlike PRIMARY KEY constraints, UNIQUE constraints allow for the value NULL. Sin embargo, de la misma forma que cualquier valor incluido en una restricción UNIQUE, solo se admite un valor NULL por columna.However, as with any value participating in a UNIQUE constraint, only one null value is allowed per column. Es posible hacer referencia a una restricción UNIQUE con una restricción FOREIGN KEY.A UNIQUE constraint can be referenced by a FOREIGN KEY constraint.

Cuando se agrega una restricción UNIQUE a una o varias columnas de la tabla, de forma predeterminada, el Motor de base de datosDatabase Engine examina los datos existentes en las columnas para garantizar que todos los valores sean únicos.When a UNIQUE constraint is added to an existing column or columns in the table, by default, the Motor de base de datosDatabase Engine examines the existing data in the columns to make sure all values are unique. Si se agrega una restricción UNIQUE a una columna que contiene valores duplicados, Motor de base de datosDatabase Engine devuelve un error y no agrega la restricción.If a UNIQUE constraint is added to a column that has duplicated values, the Motor de base de datosDatabase Engine returns an error and does not add the constraint.

Motor de base de datosDatabase Engine crea automáticamente un índice UNIQUE para exigir, de acuerdo con la restricción UNIQUE, que no haya duplicados.The Motor de base de datosDatabase Engine automatically creates a UNIQUE index to enforce the uniqueness requirement of the UNIQUE constraint. Por lo tanto, si se intenta insertar una fila duplicada, Motor de base de datosDatabase Engine devolverá un mensaje de error para indicar que se ha infringido la restricción UNIQUE y no se agregará la fila a la tabla.Therefore, if an attempt to insert a duplicate row is made, the Motor de base de datosDatabase Engine returns an error message that states the UNIQUE constraint has been violated and does not add the row to the table. A menos que se especifique explícitamente un índice clúster, se creará de forma predeterminada un índice único, no clúster, para exigir la restricción UNIQUE.Unless a clustered index is explicitly specified, a unique, nonclustered index is created by default to enforce the UNIQUE constraint.

Restricciones CHECKCHECK Constraints

Las restricciones CHECK exigen la integridad del dominio mediante la limitación de los valores que puede aceptar una o varias columnas.CHECK constraints enforce domain integrity by limiting the values that are accepted by one or more columns. Puede crear una restricción CHECK con cualquier expresión lógica (booleana) que devuelva TRUE (verdadero) o FALSE (falso) basándose en operadores lógicos.You can create a CHECK constraint with any logical (Boolean) expression that returns TRUE or FALSE based on the logical operators. 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.For example, the range of values for a salary column can be limited by creating a CHECK constraint that allows for only data that ranges from $15,000 through $100,000. Esto evita que los salarios caigan fuera del intervalo de salario normal.This prevents salaries from being entered beyond the regular salary range. La expresión lógica sería la siguiente: salary >= 15000 AND salary <= 100000.The logical expression would be the following: salary >= 15000 AND salary <= 100000.

Puede aplicar varias restricciones CHECK a una sola columna.You can apply multiple CHECK constraints to a single column. También puede aplicar una sola restricción CHECK a varias columnas si se crea en el nivel de la tabla.You can also apply a single CHECK constraint to multiple columns by creating it at the table level. Por ejemplo, una restricción CHECK para varias columnas se podría usar para confirmar que cualquier fila con un valor USA en la columna country_region tiene también un valor de dos caracteres en la columna state .For example, a multiple-column CHECK constraint could be used to confirm that any row with a country_region column value of USA also has a two-character value in the state column. Así se pueden comprobar varias condiciones en un mismo sitio.This allows for multiple conditions to be checked in one location.

Las restricciones CHECK son similares a las restricciones FOREIGN KEY porque controlan los valores que se colocan en una columna.CHECK constraints are similar to FOREIGN KEY constraints in that they control the values that are put in a column. 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.The difference is in how they determine which values are valid: FOREIGN KEY constraints obtain the list of valid values from another table, while CHECK constraints determine the valid values from a logical expression.

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.Constraints that include implicit or explicit data type conversion may cause certain operations to fail. 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.For example, such constraints defined on tables that are sources of partition switching may cause an ALTER TABLE...SWITCH operation to fail. Evite la conversión de tipos de datos en las definiciones de las restricciones.Avoid data type conversion in constraint definitions.

Limitaciones de las restricciones CHECKLimitations of CHECK Constraints

Las restricciones CHECK rechazan los valores que se evalúan como FALSE.CHECK constraints reject values that evaluate to FALSE. Puesto que los valores nulos se evalúan como UNKNOWN, su presencia en las expresiones puede reemplazar una restricción.Because null values evaluate to UNKNOWN, their presence in expressions may override a constraint. 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).For example, suppose you place a constraint on an int column MyColumn specifying that MyColumn can contain only the value 10 (MyColumn=10). Si inserta el valor NULL en MyColumn, Motor de base de datosDatabase Engine inserta NULL y no devuelve un error.If you insert the value NULL into MyColumn, the Motor de base de datosDatabase Engine inserts NULL and does not return an error.

Una restricción CHECK devuelve TRUE cuando la condición que está comprobando no es FALSE para ninguna fila de la tabla.A CHECK constraint returns TRUE when the condition it is checking is not FALSE for any row in the table. Una restricción CHECK opera en el nivel de fila.A CHECK constraint works at the row level. Si una tabla recién creada no tiene filas, cualquier restricción CHECK en esta tabla se considerará válida.If a table that has just been created does not have any rows, any CHECK constraint on this table is considered valid. Esta situación puede generar resultados inesperados, como en el siguiente ejemplo.This situation can produce unexpected results, as in the following example.

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.The CHECK constraint being added specifies that there must be at least one row in table 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.However, because there are no rows in the table against which to check the condition of this constraint, the ALTER TABLE statement succeeds.

Las restricciones CHECK no se validan durante las instrucciones DELETE.CHECK constraints are not validated during DELETE statements. Por lo tanto, la ejecución de instrucciones DELETE en las tablas con ciertos tipos de restricciones CHECK puede generar resultados inesperados.Therefore, executing DELETE statements on tables with certain types of check constraints may produce unexpected results. Por ejemplo, imaginemos que las siguientes instrucciones se ejecutan en la tabla CheckTbl.For example, consider the following statements executed on table 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.The DELETE statement succeeds, even though the CHECK constraint specifies that table CheckTbl must have at least 1 row.

Tareas relacionadasRelated Tasks

Nota

Si se publica la tabla para la replicación, debe modificar el esquema mediante la instrucción Transact-SQL ALTER TABLE o SMO (Objetos de administración de SQL Server).If the table is published for replication, you must make schema changes using the Transact-SQL statement ALTER TABLE or SQL Server Management Objects (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.When schema changes are made using the Table Designer or the Database Diagram Designer, it attempts to drop and recreate the table. No se pueden eliminar objetos publicados, por lo que la modificación del esquema generará un error.You cannot drop published objects, therefore the schema change will fail.

TareaTask TemaTopic
Describe cómo crear una restricción UNIQUE.Describes how to create a unique constraint. Crear restricciones UNIQUECreate Unique Constraints
Describe cómo modificar una restricción UNIQUE.Describes how to modify a unique constraint. Modificar restricciones UNIQUEModify Unique Constraints
Describe cómo eliminar una restricción UNIQUE.Describes how to delete a unique constraint. Eliminar restricciones UNIQUEDelete Unique Constraints
Describe cómo deshabilitar una restricción CHECK cuando un agente de replicación inserta o actualiza datos en una tabla.Describes how to disable a check constraint when a replication agent inserts or updates data in your table. Deshabilitar restricciones CHECK para la replicaciónDisable Check Constraints for Replication
Describe cómo deshabilitar una restricción CHECK al agregar, actualizar o eliminar datos en una tabla.Describes how to disable a check constraint when data is added to, updated in, or deleted from a table. Deshabilitar restricciones CHECK con instrucciones INSERT y UPDATEDisable Check Constraints with INSERT and UPDATE Statements
Describe cómo cambiar la expresión de restricción o las opciones que la habilitan o deshabilitan en condiciones específicas.Describes how to change the constraint expression or the options that enable or disable the constraint for specific conditions. Modificar restricciones CHECKModify Check Constraints
Describe cómo eliminar una restricción CHECK.Describes how to delete a check constraint. Eliminar restricciones CHECKDelete Check Constraints
Describe cómo ver las propiedades de una restricción CHECK.Describes how to view the properties of a check constraint. Restricciones UNIQUE y restricciones CHECKUnique Constraints and Check Constraints