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

Agregue una restricción CHECK a una tabla existente en SQL Server (T-SQL)

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.