Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come creare un vincolo di controllo su più colonne in SQL Server - Esercitazione su SQL Server / TSQL Parte 84

Scenario:

Stai lavorando come sviluppatore di SQL Server, devi creare una tabella dbo.Customer che dovrebbe avere le colonne Nome, Età e Tipo di età. Puoi aggiungere CustomerId come identità. È necessario creare le colonne Verifica vincolo su età e tipo di età con la logica sottostante


<65 agetype="Adulto" and="" p="">
Se è vero, lascia che il record si inserisca o si aggiorni, altrimenti non riesce a causa del vincolo di controllo.

<65 agetype="Adulto" and="" p="">Soluzione:

<65 agetype="Adult" and="" p="">Lo script sottostante può essere utilizzato per aggiungere il vincolo di controllo su più colonne in base ai nostri requisiti.


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'
            )
        )
    )
 
 
Inseriamo alcuni record e proviamo a vedere se Check Constraint funziona come previsto.


 
--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 riga/i interessata/e)
Msg 547, livello 16, stato 0, riga 25
L'istruzione INSERT era in conflitto con il vincolo CHECK "dbo_Customer_AgeAndAgeType". Il conflitto si è verificato nel database "YourDatabaseName", tabella "dbo.Customer".
L'istruzione è stata terminata.

(1 riga/i interessata/e)
Msg 547, livello 16, stato 0, riga 33
L'istruzione INSERT era in conflitto con il vincolo CHECK "dbo_Customer_AgeAndAgeType". Il conflitto si è verificato nel database "YourDatabaseName", tabella "dbo.Customer".
L'istruzione è stata terminata.
Msg 547, livello 16, stato 0, riga 37
L'istruzione INSERT era in conflitto con il vincolo CHECK "dbo_Customer_AgeAndAgeType". Il conflitto si è verificato nel database "YourDatabaseName", tabella "dbo.Customer".
L'istruzione è stata terminata.

(1 riga/i interessata/e)

Controlliamo i dati nella tabella utilizzando select query. Come si può vedere di seguito vengono inseriti gli unici record che hanno superato il Check Constraint. Impossibile inserire il resto dei record.
Come creare un vincolo di controllo su più colonne nella tabella di SQL Server

Proviamo ad aggiornare i record e vediamo se Check Constraint funziona come previsto.

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


Non è riuscito con il seguente errore poiché non possiamo avere 30 anni per AgeType='Child' secondo la nostra logica di controllo dei vincoli.

Msg 547, livello 16, stato 0, Riga 18
L'istruzione UPDATE era in conflitto con il vincolo CHECK "dbo_Customer_AgeAndAgeType". Il conflitto si è verificato nel database "YourDatabaseName", tabella "dbo.Customer".
L'istruzione è stata terminata.


Video Demo:come creare un vincolo di controllo su Più colonne in SQL Server