Este artículo demuestra cómo agregar un CHECK
restricción a una tabla existente.
Puede agregar una restricción a una tabla existente usando ALTER TABLE
instrucción junto con ADD CONSTRAINT
argumento. Ejemplos a continuación.
Ejemplo 1:crear la tabla
Primero, creemos una tabla para la cual agregaremos el CHECK
restricción.
CREATE TABLE Event ( EventId int IDENTITY(1,1) NOT NULL PRIMARY KEY, EventName varchar(255) NOT NULL, StartDate date NOT NULL, EndDate date NOT NULL, Price smallmoney NOT NULL );
Ejemplo 2:agregar una restricción de nivel de columna
Ahora agreguemos un CHECK
restricción al
Precio
columna.
ALTER TABLE Event ADD CONSTRAINT chkPrice CHECK (Price > 0);
Esta restricción asegurará que el precio sea siempre mayor que cero.
Ahora que se ha agregado la restricción, esto es lo que sucede si intentamos insertar datos no válidos:
INSERT INTO Event ( EventName, StartDate, EndDate, Price ) VALUES ( 'ICCC 2020', '2020-01-01', '2020-02-02', 0 );
Resultado:
Msg 547, Level 16, State 0, Line 1 The INSERT statement conflicted with the CHECK constraint "chkPrice". The conflict occurred in database "EMS", table "dbo.Event", column 'Price'.
En este caso, el CHECK
restricción especifica que todos los datos en el Price
la columna debe ser mayor que 0. En otras palabras, el precio no puede ser cero y no puede ser negativo.
Esto se conoce como una restricción a nivel de columna , porque se define en una sola columna. Se aplica a los datos de una columna.
Ejemplo 3:agregar una restricción de nivel de tabla
Ahora agreguemos un CHECK
a nivel de tabla restricción. Esto verificará los datos en dos columnas.
ALTER TABLE Event ADD CONSTRAINT chkEndDate CHECK (EndDate >= StartDate);
En este caso, agrego una restricción para garantizar que la fecha de finalización nunca sea anterior a la fecha de inicio. Esto es verificar datos en dos columnas y, por lo tanto, es una restricción a nivel de tabla.
Intente insertar un valor no válido:
INSERT INTO Event ( EventName, StartDate, EndDate, Price ) VALUES ( 'ICCC 2020', '2020-01-01', '1970-02-02', 150.00 );
Resultado:
Msg 547, Level 16, State 0, Line 1 The INSERT statement conflicted with the CHECK constraint "chkEndDate". The conflict occurred in database "EMS", table "dbo.Event".
Como era de esperar, la operación falla porque mi fecha de finalización es anterior a la fecha de inicio.
Tenga en cuenta que para probar esta restricción, tuve que aumentar el precio a un valor válido para evitar que la restricción anterior se activara primero (CHECK
las restricciones se validan en el orden en que se crean).
Ejemplo 4:inserción exitosa de datos que cumplen con la restricción
Para insertar correctamente una fila, todo lo que debemos hacer es asegurarnos de que estamos insertando valores válidos.
Ejemplo:
INSERT INTO Event ( EventName, StartDate, EndDate, Price ) VALUES ( 'ICCC 2020', '2020-01-01', '2020-02-02', 150.00 ); SELECT * FROM Event;
Resultado:
+-----------+-------------+-------------+------------+----------+ | EventId | EventName | StartDate | EndDate | Price | |-----------+-------------+-------------+------------+----------| | 4 | ICCC 2020 | 2020-01-01 | 2020-02-02 | 150.0000 | +-----------+-------------+-------------+------------+----------+
Tenga en cuenta que
EventId
la columna ya se incrementó a 4. Esto se debe a que es una IDENTITY
columna. Una cosa importante para recordar sobre IDENTITY
columnas es que se incrementan incluso cuando una restricción provoca un INSERT
falla la operación.
Algunas restricciones de las restricciones CHECK
Aquí hay algunas restricciones a tener en cuenta al trabajar con CHECK
restricciones:
- La condición de búsqueda debe evaluarse como una expresión booleana y no puede hacer referencia a otra tabla.
- La expresión no puede contener tipos de datos de alias.
CHECK
no se pueden definir restricciones en texto , ntext o imagen columnas.