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>
<65 agetype="Adult" and="" p="">Řešení:65>
<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.65>
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