Guía para principiantes de las restricciones CHECK en SQL Server

Durante mi educación, uno de mis maestros dijo: "Un amigo mío obtuvo un puntaje de 105 en una prueba de ciencias de 100. Me preguntaba cómo es posible obtener un puntaje de 105 sobre 100. En este caso, el valor fue inflado. Más tarde, se reveló que la puntuación fue un error de cálculo. Su puntaje fue de 97. En algunos contextos, hay un rango de valores definidos, y ningún valor debe exceder el rango definido ".

El mismo concepto se aplica a las restricciones de verificación en SQL Server. Consideremos la edad de un empleado como un tipo de datos enteros para una columna en una tabla de empleados. Uno de los empleados ha ingresado el número -76 (76 negativo) en la columna Edad. En el contexto de la edad, no es posible tener la edad en un número negativo. El servidor SQL no generará ningún error porque los valores negativos son aceptables en un tipo de datos enteros. Para evitar esto, la columna de Edad debe aceptar solo números positivos. Esto se puede lograr agregando una restricción de verificación en la columna Edad para la tabla de empleados. Empecemos.

Crear una tabla de empleados con restricciones CHECK

Para la compañía ABC, según sus políticas, los empleados deben tener 18 años o más para trabajar para ellos. Por lo tanto, agregaremos una restricción de verificación al crear la tabla de empleados para asegurarnos de que las edades de los empleados siempre sean mayores o iguales a 18.

SI OBJECT_ID (N'Employee ', N'U') NO ES UN NULL DROP TABLE Employee; CREAR TABLA Empleado (LLA PRINCIPAL INT. De EmployeeId, Numérico de Salario (18,2), Carácter de Género (1), CHEQUEO INT de Edad (EDAD> = 18) - Comprobar condición de restricción) 

La condición VERIFICAR (EDAD> = 18) agrega una restricción de verificación en la tabla de empleados con una condición donde la edad de un empleado debe ser mayor o igual a 18.

Intentaremos insertar algunos registros para asegurarnos de que nuestra restricción de verificación funciona.

a. Agregar un empleado cuya edad es 18.

INSERT INTO Valores de empleado (EmployeeId, Name, Salary, Gender, Age) (100, 'Niraj', 67000.00, 'M', 18); (1 fila (s) afectadas) 

La edad ha sido insertada exitosamente.

segundo. Agregue un empleado cuya edad sea 15, lo que viola el rango de restricción de verificación.

INSERT INTO Valores de empleado (EmployeeId, Name, Salary, Gender, Age) (101, 'Chetan', 56000.00, 'M', 15); 

SQL Server ha generado el siguiente error porque Edad = 15 está por debajo del rango definido en la restricción CHECK.

Msg 547, nivel 16, estado 0, línea 13 La instrucción INSERT entró en conflicto con la restricción CHECK "CK__Employee__Age__3B0BC30C". El conflicto se produjo en la base de datos "VishLearningDB", tabla "dbo.Employee", columna 'Age'. La instrucción se ha terminado. 

do. Agregar un empleado cuya edad es 26.

INSERT INTO Valores de empleado (EmployeeId, Name, Salary, Gender, Age) (103, 'Mani', 329999.00, 'F', 15); (1 fila (s) afectadas) 

El valor se ha insertado correctamente.

Agregar una restricción CHECK en una tabla existente

Ahora, queremos asegurarnos de que nuestra columna Género solo permita los valores M (masculino) y F (femenino).

Vamos a crear una restricción de verificación.

Sintaxis

ALTER TABLE ADD Restricción  VERIFICAR () 

Ejemplo

ALTER TABLE Empleado ADD Restricción CK_Employee_Gender CHECK (Gender = 'M' OR GENDER = 'F'); 

Vamos a insertar un empleado masculino y femenino más.

INSERT INTO Valores de empleado (EmployeeId, Name, Salary, Gender, Age) (104, 'Meera', 23000.00, 'F', 26); INSERT INTO Valores de empleado (EmployeeId, Name, Salary, Gender, Age) (105, 'Shailesh', 24000.00, 'M', 28); (1 fila (s) afectadas) (1 fila (s) afectadas) 

Fue insertado con éxito.

Ahora, intentaremos insertar otro personaje en la columna Género.

INSERT INTO Valores de empleado (EmployeeId, Name, Salary, Gender, Age) (105, 'Vish', 24000.00, 'V', 28); 

La restricción de verificación tiene el error de abajo.

Msg 547, nivel 16, estado 0, línea 31 La instrucción INSERT entró en conflicto con la restricción CHECK "CK_Employee_Gender". El conflicto ocurrió en la base de datos "master", tabla "dbo.Employee", columna 'Gender'. La instrucción se ha terminado. 

Agregar una restricción CHECK la opción WITH NOCHECK

¿Qué sucede si ya hemos insertado algunos valores que no se ajustan a la nueva restricción de verificación? Supongamos que en la columna Salario hemos insertado una entrada incorrecta con un salario de $ -2300.00. Ahora, queremos implementar una restricción de verificación para que la columna Salario solo acepte valores mayores a cero.

Intentaremos agregar una restricción de verificación a la opción WITH NOCHECK.

Primero, inserte un empleado con un salario de -2300.00.

INSERT INTO Valores de empleado (EmployeeId, Name, Salary, Gender, Age) (105, 'Vish', -2300.00, 'M', 28); 

Ahora intente agregar una restricción de verificación según la sintaxis anterior.

ALTER TABLE Empleado ADD Restricción CK_Employee_Salary CHECK (Salario> 0); 

Falla y muestra el siguiente mensaje de error porque los valores existentes no cumplen con la condición de restricción de verificación.

La instrucción ALTER TABLE entró en conflicto con la restricción CHECK "CK_Employee_Salary". El conflicto se produjo en la base de datos "VishLearningDB", tabla "dbo.Employee", columna 'Salario'. 

En el caso anterior, todavía podemos crear una restricción de verificación utilizando WITH NOCHECK. Esto no validará los datos existentes contra la nueva condición de restricción de verificación.

ALTER TABLE Empleado CON NOCHECK ADD Restricción CK_Employee_Salary CHECK (Salario> 0); 

Lee mas en SQL Server desde los archivos de Tech-Recipes.