sql >> Databáze >  >> RDS >> Sqlserver

Jak vytvořit kontrolní omezení pro více sloupců na SQL Server - SQL Server / TSQL výukový program, část 84

Scénář:

Pracujete jako vývojář SQL Server, musíte vytvořit tabulku dbo.Customer, která by měla mít sloupce Jméno, Věk a Typ věku. Jako Identitu můžete přidat CustomerId. Musíte vytvořit kontrolní omezení u sloupců Věk a Typ věku s níže uvedenou logikou


<65 agetype="Adult" and="" p="">
Pokud je pravda, pak nechte vložení záznamu nebo aktualizaci jinak selhat kvůli kontrole omezení.

<65 agetype="Adult" and="" p="">Řešení:

<65 agetype="Adult" and="" p="">Skript níže lze použít k přidání kontroly omezení do více sloupců podle našeho požadavku.


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'
            )
        )
    )
 
 
Pojďme vložit několik záznamů a pokusíme se zjistit, zda Check Constraint funguje podle očekávání.


 
--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 ovlivněný řádek)
Zpráva 547, úroveň 16, stav 0, řádek 25
Příkaz INSERT byl v konfliktu s omezením CHECK "dbo_Customer_AgeAndAgeType". Ke konfliktu došlo v databázi "YourDatabaseName", tabulce "dbo.Customer".
Příkaz byl ukončen.

(1 ovlivněný řádek)
Msg 547, Level 16, stav 0, řádek 33
Příkaz INSERT byl v konfliktu s omezením CHECK "dbo_Customer_AgeAndAgeType". Ke konfliktu došlo v databázi "YourDatabaseName", tabulce "dbo.Customer".
Příkaz byl ukončen.
Zpráva 547, úroveň 16, stav 0, řádek 37
Příkaz INSERT byl v konfliktu s omezení CHECK "dbo_Customer_AgeAndAgeType". Ke konfliktu došlo v databázi "YourDatabaseName", tabulce "dbo.Customer".
Příkaz byl ukončen.

(1 ovlivněný řádek)

Zkontrolujeme data v tabulce pomocí výběrového dotazu. Jak je vidět níže, jsou vloženy pouze záznamy, které prošly kontrolním omezením. Zbytek záznamů nelze vložit.
Jak vytvořit kontrolní omezení pro více sloupců v tabulce SQL Server

Zkusme aktualizovat záznamy a zjistit, zda Check Constraint funguje podle očekávání.

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


Nezdařilo se to s níže uvedenou chybou, protože nemůžeme mít věk 30 pro AgeType='Child' podle naší logiky Check Constraint.

Zpráva 547, úroveň 16, stav 0, Řádek 18
Příkaz UPDATE byl v konfliktu s omezením CHECK "dbo_Customer_AgeAndAgeType". Ke konfliktu došlo v databázi "YourDatabaseName", tabulce "dbo.Customer".
Příkaz byl ukončen.


Video Demo :Jak vytvořit kontrolní omezení na Více sloupců v SQL Server

  1. Jak zjistit, zda upsert byl aktualizací s PostgreSQL 9.5+ UPSERT?

  2. Připojení PHP na Linuxu k Microsoft Access na Windows Share

  3. Jak rozdělit řetězec na SQL Server

  4. Instalace WordPressu pomocí WP-CLI