Nybörjarhandbok för att kontrollera begränsningar i SQL Server

Under min skola sa en av mina lärare: "Min vän gjorde 105 på ett vetenskapstest av 100. Jag undrade hur det går att poängera 105 av 100. I det här fallet uppblåsts värdet. Senare blev det avslöjat att poängen var en felberäkning. Hans poäng var 97. I vissa sammanhang finns en rad värden definierade och inget värde bör överstiga det definierade intervallet. "

Samma begrepp gäller kontrollbegränsningar i SQL Server. Låt oss betrakta en anställdes ålder som en heltalsdatatyp för en kolumn i en anställd tabell. En av medarbetarna har skrivit in -76 (negativ 76) i kolumnen Ålder. I åldersgränserna är det inte möjligt att få ålder i ett negativt tal. SQL-servern kommer inte att höja något fel eftersom negativa värden är acceptabla i en heltaldatatyp. För att förhindra detta bör kolumnen Ålder endast acceptera positiva tal. Detta kan åstadkommas genom att lägga till en kontrollbegränsning i kolumnen Ålder för anställd tabellen. Låt oss börja.

Skapa ett anställdabord med CHECK-begränsningar

För företagets ABC, enligt deras policy, måste anställda vara 18 år eller äldre för att arbeta för dem. Därför lägger vi till en kontrollbegränsning när vi skapar arbetstabellen för att se till att medarbetarnas åldrar alltid är större än eller lika med 18.

OM OBJECT_ID (N'Employee ', N'U') ÄR INTE NULL DROP TABLE Employee; CREATE TABLE Medarbetare (EmployeeId INT PRIMARY KEY, Lönnummer (18,2), Gender Char (1), Ålder INT CHECK (ÅLDER> = 18) - Kontrollera begränsningsvillkor); 

Skicket KONTROLLERA (ÅLDER> = 18) lägger till en kontrollbegränsning på arbetstabellen med ett villkor där en anställdes ålder ska vara större än eller lika med 18.

Vi försöker lägga in några poster för att se till att vår kontrollbegränsning fungerar.

en. Lägg till en anställd vars ålder är 18 år.

INSÄTTNING I MEDARBETARE (Anställd, Namn, Lön, Kön, Ålder) Värden (100, 'Niraj', 67000.00, 'M', 18); (1 rad (er) drabbade) 

Åldern har införts med framgång.

b. Lägg till en anställd vars ålder är 15, vilket bryter mot kontrollbegränsningsområdet.

INSÄTTNING I MEDARBETARE (Anställd, Namn, Lön, Kön, Ålder) Värden (101, 'Chetan', 56000.00, 'M', 15); 

SQL Server har höjt felet nedan eftersom Age = 15 ligger under det intervall som definieras i CHECK-begränsningen.

Msg 547, Nivå 16, Stat 0, Linje 13 INSERT-meddelandet strider mot CHECK-begränsningen "CK__Employee__Age__3B0BC30C". Konflikten inträffade i databasen "VishLearningDB", tabell "dbo.Employee", kolumn "Age". Uttalandet har avslutats. 

c. Lägg till en anställd vars ålder är 26 år.

INSÄTT I MEDARBETARE (Anställd, Namn, Lön, Kön, Ålder) Värden (103, 'Mani', 329999.00, 'F', 15); (1 rad (er) drabbade) 

Värdet har införts med framgång.

Lägg till en kontrollbegränsning på ett befintligt bord

Nu vill vi se till att vår Gender-kolumn endast tillåter M (manliga) och F (kvinnliga) värden.

Vi kommer att skapa en kontrollbegränsning.

Syntax

ALTER TABLE ADD BEGRÄNSNING  KONTROLLERA () 

Exempel

ALTER TABLE Medarbetare ADD-begränsning CK_Employee_Gender CHECK (Kön = 'M' ELLER GENDER = 'F'); 

Låt oss lägga in ytterligare en manlig och kvinnlig anställd.

INSÄTT I MEDARBETARE (Anställd, Namn, Lön, Kön, Ålder) Värden (104, 'Meera', 23000.00, 'F', 26); INSÄTTNING I MEDARBETARE (Anställd, Namn, Lön, Kön, Ålder) Värden (105, 'Shailesh', 24000.00, 'M', 28); (1 rad (er) drabbade) (1 rad (er) drabbade) 

Det infördes med framgång.

Nu ska vi försöka infoga ett annat tecken i kolumnen Gender.

INSÄTTNING I MEDARBETARE (Anställd, Namn, Lön, Kön, Ålder) Värden (105, 'Vish', 24000.00, 'V', 28); 

Kontrollbegränsningen har felet nedan.

Msg 547, Nivå 16, Stat 0, Linje 31 INSERT-meddelandet strider mot CHECK-begränsningen "CK_Employee_Gender". Konflikten inträffade i databasen "master", tabell "dbo.Employee", kolumn "Gender". Uttalandet har avslutats. 

Lägg till en KONTROLL Begränsa WITH NOCHECK-alternativet

Vad händer om vi redan har lagt in några värden som inte överensstämmer med den nya kontrollbegränsningen? Antag att i lönekolumnen har vi lagt in en felaktig post med en lön som $ -2300.00. Nu vill vi genomföra en kontrollbegränsning så att lönekolonnen endast accepterar värden som är större än noll.

Vi kommer att försöka lägga till en kontrollbegränsning alternativet WITH NOCHECK.

Först sätta in en anställd med en lön på -2300,00.

INSÄTTNING I MEDARBETARE (Anställd, Namn, Lön, Kön, Ålder) Värden (105, 'Vish', -2300.00, 'M', 28); 

Försök nu lägga till en Check-begränsning enligt ovanstående syntax.

ALTER TABLE Anställd ADD-begränsning CK_Employee_Salary CHECK (Lön> 0); 

Det misslyckas och ger felmeddelandet nedan eftersom de befintliga värdena inte överensstämmer med kontrollbegränsningsförhållandet.

ALTER TABLE-stämningen strider mot CHECK-begränsningen "CK_Employee_Salary". Konflikten inträffade i databasen "VishLearningDB", tabell "dbo.Employee", kolumn "Lön". 

I det ovanstående fallet kan vi fortfarande skapa en kontrollbegränsning med hjälp av WITH NOCHECK. Detta kommer inte att validera befintliga data mot det nya kontrollbegränsningsvillkoren.

ALTER TABLE Medarbetare MED NÄKHÄLL ADD BEGRÄNSNING CK_Employee_Salary CHECK (Lön> 0); 

Läs mer på SQL Server från Tech-Recipes arkiv.