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

CHECK Restricciones en SQL Server

En este artículo, hablaremos sobre las restricciones CHECK. Veremos cómo agregar restricciones CHECK a las columnas de la tabla de SQL Server y discutiremos las trampas que puede encontrar al usar este tipo de restricciones de SQL Server.

Aspectos básicos de la restricción CHECK

Las restricciones CHECK son simplemente declaraciones condicionales (predicados que devuelven VERDADERO o FALSO) que se refieren a las columnas de la tabla para mantener la integridad de los datos. Cuando uno inserta datos en una columna o varias columnas en una sola fila, las restricciones CHECK entran en acción. Evalúan los datos a insertar. En caso de que los datos no cumplan la condición especificada en la restricción CHECK, la inserción falla.

Considere el siguiente ejemplo:

Se requiere establecer una restricción a la columna Salario para que almacene solo valores positivos que no superen los $150.000. La declaración condicional tendrá el siguiente aspecto:(Salario>=0 y Salario <=150000). Al intentar insertar valores negativos, el predicado dará como resultado FALSO y la inserción fallará.

Es posible agregar una restricción CHECK a una o varias columnas. La adición de una restricción CHECK de varias columnas se puede implementar a nivel de tabla.

Trabajar con restricciones CHECK

Cómo crear restricciones CHECK en SSMS

  1. En Explorador de objetos , navegue a una tabla requerida.

  2. Haga clic con el botón derecho en Restricciones carpeta y luego c lamer Nueva Restricción…

  3. En el panel derecho de Comprobar restricciones cuadro de diálogo, haga clic en Expresión y luego haga clic en el botón de puntos suspensivos.

  1. Escriba una expresión de restricción CHECK en el campo de texto de la Expresión de restricción caja de diálogo. Por ejemplo, para permitir solo códigos postales de siete dígitos en una columna Zip, la expresión puede tener el siguiente aspecto:

En el Diseñador de tablas sección, puede configurar las reglas para hacer cumplir la restricción.

COMPROBAR Restricción en CREAR TABLA

Considere el siguiente ejemplo:

Se requiere crear una tabla que almacene datos sobre los clientes del banco y llenarla con datos de prueba. La tabla incluirá las siguientes columnas:Identificación del cliente, Nombre, Apellido, Estado, Teléfono, Ciudad, Estado y Código postal.

Al desarrollar la tabla, debemos tener en cuenta los siguientes hechos:

  1. El formato ZIP básico consta de cinco dígitos numéricos.

  2. El número de teléfono estadounidense estándar tiene diez dígitos, como (555) 555-1234

  3. Se utilizan abreviaturas de dos letras para representar las divisiones políticas de los Estados Unidos para direcciones postales, procesamiento de datos, abreviaturas generales y otros fines.

La tarea es proporcionar consistencia de datos para la tabla. Se requiere prohibir la inserción de números de teléfono de 12 dígitos y códigos postales de 6 dígitos, etc. Para hacer esto, SQL Server nos permite agregar una o más restricciones CHECK para cada columna de la tabla.

En la sección anterior, examinamos la única forma de crear una restricción CHECK en SSMS. Ahora, discutiremos cómo crear la restricción con la ayuda de T-SQL.

La siguiente secuencia de comandos muestra cómo crear una restricción CHECK en la columna Zip:

CREATE TABLE Customers
(
 Customer_Id tinyint NOT NULL,
 [First Name] varchar(50),
 [Last Name] varchar(50),
 Status varchar(50),
 Phone tinyint,
 Address varchar(50),
 State varchar(50),
 Zip tinyint,
 Email varchar(50),
 [Credit Limit] INT NULL,
 CONSTRAINT CK_Zip CHECK (Zip LIKE REPLICATE ('[0-9]', 5)) --Check Constraint Condition
)

Ahora, veamos qué obtenemos al intentar insertar un valor de 6 dígitos en la columna Zip:

INSERT INTO dbo.Customers (Customer_Id, [First Name], [Last Name], Status, Phone, Address, State, Zip, Email)
SELECT 1, 'James', 'Madison', 'Mr', 555-555-1234, 'Madison street, 12', 'LA', 123456, NULL
GO

La inserción falla y SQL Server muestra la siguiente prevención:

Hasta ahora todo bien.

Expresión CASE en la restricción CHECK

Suponga que el banco tiene una regla comercial para establecer el límite de crédito para los residentes del estado de Luisiana en menos de $150,000. Implementaremos este requisito agregando una restricción CHECK a la columna Límite de crédito:

ALTER TABLE dbo.Customers
ADD CONSTRAINT CK_Credit_Limit
CHECK (State='LA' AND [Credit Limit] <= 150000)
GO

INSERT INTO Customers (Customer_Id, Name, Status, Phone, State, Zip, Email, [Credit Limit])
VALUES (1, 'James Black', 'Mr', 5558787, 'LA', 46853, '[email protected]', 120000);
GO

INSERT INTO Customers (Customer_Id, Name, Status, Phone, State, Zip, Email, [Credit Limit])
VALUES (2, 'Mark Spencer', 'Mr', 3332244, 'NY', 23487, '[email protected]', 200000);
GO

A medida que ejecutamos la declaración anterior, obtenemos el siguiente error:

La declaración INSERT entró en conflicto con la restricción CHECK. ¿Qué salió mal?

Echemos un vistazo más de cerca a la consulta. Tenga en cuenta que la restricción CHECK solo permite los valores 'LA' para la columna Estado. Al mismo tiempo, los valores en la columna Crédito no deben exceder 150000.

Del mismo modo, la restricción CHECK no permitiría escribir otros códigos de estado en la columna.

Por lo tanto, necesitamos modificar la condición. De acuerdo con la lógica comercial, el banco proporciona $150 000 del límite de crédito para los residentes de Luisiana. Al mismo tiempo, este valor puede variar para otros residentes.

Para implementar este caso, usaremos la cláusula CASE dentro de la restricción CHECK:

ALTER TABLE dbo.Customers
ADD CONSTRAINT CK_Credit_Limit
CHECK (CASE WHEN State='LA' AND [Credit Limit] <= 150000 THEN 1 ELSE 0 END = 1)
GO

Esta expresión cumple completamente con la lógica empresarial.

Valores NULL en la restricción CHECK

El banco divide a sus clientes en segmentos. La columna Estado contiene los datos que determinan si un cliente es VIP o regular. El monto máximo del límite de crédito para los clientes regulares es de $200,000. Los VIP pueden sacar $500,000.

La restricción CHECK puede tener el siguiente aspecto:

ALTER TABLE dbo.Customers
ADD CONSTRAINT CK_Status_Credit_Limit
CHECK (Status = 'VIP' OR Status = 'Regular')
GO

Tenga en cuenta que la restricción CHECK permite insertar valores NULL en la columna State (siempre que no haya una restricción NOT NULL explícitamente definida). La restricción CHECK evalúa los valores y devuelve VERDADERO o FALSO. Evalúa NULL como DESCONOCIDO. Por lo tanto, los valores NULL no provocarán errores. Esto es contrario a los predicados en las cláusulas WHERE en las instrucciones SELECT o UPDATE.

CHEQUEO y NOCHEQUEO

De vez en cuando, la lógica empresarial cambia. Provoca modificaciones en los objetos de la base de datos. Imagine que un país amplía la base de códigos postales y agrega valores de 6 dígitos.

Los antiguos valores de 5 dígitos ya no se asignarán a las áreas. Sin embargo, siguen siendo válidos para los existentes. Por lo tanto, la restricción CHECK debe tener en cuenta los datos existentes en el formato antiguo y validar los datos en el nuevo formato.

La cláusula NOCHECK resuelve este problema:

ALTER TABLE Customers WITH NOCHECK
ADD CONSTRAINT CK_Zip_Code
CHECK (Zip LIKE REPLICATE('[0-9]', 6));
GO

La siguiente inserción es exitosa:

INSERT INTO Customers (Customer_Id, Name, Status, Phone, State, Zip, Email, [Credit Limit])
VALUES (102, 'Jake Harrison', 'VIP', 555-555-1234, 'NY', 123456, '[email protected]', 100000);
GO

Al intentar insertar un código postal de cinco dígitos, el motor arroja el error:

DBCC VERIFICAR RESTRICCIONES

SQL Server proporciona DBCC CHECKCONSTRAINTS para buscar datos que no coinciden con las restricciones.

Si hay un problema de integridad de la base de datos, ejecute DBCC CHECKCONSTRAINTS para toda la base de datos para asegurarse de que no haya problemas.

Tenga en cuenta que este comando afecta el rendimiento. Por lo tanto, no debería ejecutarse de forma programada.

Es posible ejecutar DBCC CHECKCONSTRAINTS para una sola restricción, una tabla o toda la base de datos.

En comparación con otros comandos de comprobación, DBCC CHECKCONSTRAINTS tarda mucho tiempo en completarse y consume recursos del sistema. A diferencia de otros comandos, CHECKCONSTRAINTS no utiliza una instantánea de la base de datos.

Conclusión

Las restricciones CHECK proporcionan el mecanismo para evaluar los datos antes de la inserción. Las restricciones CHECK pueden hacer referencia a una sola columna o a varias columnas de la tabla.

Las restricciones son simplemente predicados que dan como resultado VERDADERO, FALSO o DESCONOCIDO. En caso de que se inserte NULL en una tabla, no se viola una restricción.