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

Cómo crear una restricción de verificación en varias columnas en SQL Server - Tutorial de SQL Server/TSQL, parte 84

Escenario:

Está trabajando como desarrollador de SQL Server, necesita crear la tabla dbo.Customer que debe tener columnas de nombre, edad y tipo de edad. Puede agregar CustomerId como identidad. Debe crear una restricción de verificación en las columnas de edad y tipo de edad con la siguiente lógica


<65 agetype="Adult" and="" p="">
Si es verdadero, permita que el registro se inserte o actualice; de ​​lo contrario, fallará debido a la restricción de verificación.

<65 agetype="Adult" and="" p="">Solución:

<65 agetype="Adult" and="" p="">La siguiente secuencia de comandos se puede usar para agregar Verificar restricción en varias columnas de acuerdo con nuestros requisitos.


CREATE TABLE dbo.Customer (
    CustomerId INT identity(1, 1)
    ,NAME VARCHAR(100)
    ,Age INT
    ,AgeType VARCHAR(15)
    ,CONSTRAINT dbo_Customer_AgeAndAgeType CHECK (
        (
            Age <= 17
            AND AgeType = 'Child'
            )
        OR (
            Age > 17
            AND Age < 65
            AND AgeType = 'Adult'
            )
        OR (
            Age >= 65
            AND AgeType = 'Senior'
            )
        )
    )
 
 
Vamos a insertar algunos registros e intentar ver si Verificar restricción funciona como se espera.


 
--Correct values accrording to Constraint
insert into dbo.Customer(Name,Age,AgeType)
Values('Najaf',13,'Child')
go

--Wrong values according to Check Constraint
insert into dbo.Customer(Name,Age,AgeType)
Values('Leena',14,'Adult')
go
--Correct values accroding to Constraint
insert into dbo.Customer(Name,Age,AgeType)
Values('Raza',30,'Adult')
go
--Wrong values according to Check Constraint
insert into dbo.Customer(Name,Age,AgeType)
Values('Aamir',30,'Senior')
go
--Wrong values according to Check Constraint
insert into dbo.Customer(Name,Age,AgeType)
Values('John',65,'Adult')
go
--Correct values accroding to Constraint
insert into dbo.Customer(Name,Age,AgeType)
Values('Kris',65,'Senior')
go


(1 fila(s) afectada(s))
Mensaje 547, Nivel 16, Estado 0, Línea 25
La instrucción INSERT entró en conflicto con la restricción CHECK "dbo_Customer_AgeAndAgeType". El conflicto ocurrió en la base de datos "YourDatabaseName", tabla "dbo.Customer".
La instrucción ha finalizado.

(1 fila(s) afectada(s))
Msg 547, Level 16, estado 0, línea 33
La declaración INSERT entró en conflicto con la restricción CHECK "dbo_Customer_AgeAndAgeType". El conflicto ocurrió en la base de datos "YourDatabaseName", tabla "dbo.Customer".
La declaración ha finalizado.
Mensaje 547, Nivel 16, Estado 0, Línea 37
La declaración INSERT entró en conflicto con la restricción CHECK "dbo_Customer_AgeAndAgeType". El conflicto ocurrió en la base de datos "YourDatabaseName", tabla "dbo.Customer".
La declaración ha sido cancelada.

(1 fila(s) afectada(s))

Verifiquemos los datos en la tabla usando la consulta de selección. Como se puede ver a continuación, se insertan los únicos registros que pasaron la restricción de verificación. No se pudo insertar el resto de los registros.
Cómo crear una restricción de verificación en varias columnas en la tabla de SQL Server

Intentemos actualizar los registros y ver si Verificar restricción funciona como se espera.

update dbo.Customer
set Age=30
where Customerid=1


Falló con el siguiente error ya que no podemos tener Edad 30 para AgeType='Child' de acuerdo con nuestra lógica de verificación de restricciones.

Msg 547, Nivel 16, Estado 0, Línea 18
La instrucción UPDATE entró en conflicto con la restricción CHECK "dbo_Customer_AgeAndAgeType". El conflicto ocurrió en la base de datos "YourDatabaseName", tabla "dbo.Customer".
La instrucción ha finalizado.


Video de demostración:cómo crear una restricción de verificación en Múltiples columnas en SQL Server