Guida per principianti su CHECK Constraints in SQL Server

Durante la mia istruzione, uno dei miei insegnanti ha detto: "Un mio amico ha ottenuto 105 test scientifici su 100. Mi chiedevo come sia possibile ottenere un punteggio di 105 su 100. In questo caso, il valore è stato gonfiato. Successivamente, è stato rivelato che il punteggio era un errore di calcolo. Il suo punteggio era 97. In alcuni contesti, è stato definito un intervallo di valori e nessun valore dovrebbe superare l'intervallo definito. "

Lo stesso concetto si applica per controllare i vincoli in SQL Server. Consideriamo l'età di un dipendente come un tipo di dati interi per una colonna in una tabella dei dipendenti. Uno degli impiegati ha inserito il numero -76 (negativo 76) nella colonna Età. Nel contesto dell'età, non è possibile avere un'età in un numero negativo. Il server SQL non genera alcun errore perché i valori negativi sono accettabili in un tipo di dati intero. Per evitare ciò, la colonna Età dovrebbe accettare solo numeri positivi. Questo può essere ottenuto aggiungendo un vincolo di controllo sulla colonna Età per la tabella dei dipendenti. Iniziamo.

Creare una tabella dei dipendenti con i vincoli CHECK

Per la società ABC, secondo le loro politiche, i dipendenti devono avere almeno 18 anni per lavorare per loro. Quindi, aggiungeremo un vincolo di controllo durante la creazione della tabella dei dipendenti per assicurarsi che le età dei dipendenti siano sempre maggiori o uguali a 18.

IF OBJECT_ID (N'Employee ', N'U') NON È NULL DROP TABLE Employee; CREATE TABLE Employee (EmployeeId INT PRIMARY KEY, Salary Numeric (18,2), Gender Char (1), Age INT CHECK (ETÀ> = 18) - Verifica condizione vincoli); 

La condizione CONTROLLO (ETÀ> = 18) aggiunge un vincolo di controllo sulla tabella dei dipendenti con una condizione in cui l'età di un dipendente deve essere maggiore o uguale a 18.

Cercheremo di inserire alcuni record per assicurarci che il nostro vincolo di controllo funzioni.

un. Aggiungi un dipendente la cui età è 18.

INSERISCI I valori di Employee (EmployeeId, Name, Salary, Gender, Age) (100, 'Niraj', 67000.00, 'M', 18); (1 riga (e) interessata) 

L'età è stata inserita con successo.

b. Aggiungi un dipendente la cui età è 15, che viola l'intervallo del vincolo di controllo.

INSERISCI I valori di Employee (EmployeeId, Name, Salary, Gender, Age) (101, 'Chetan', 56000.00, 'M', 15); 

SQL Server ha sollevato l'errore di seguito perché Età = 15 è inferiore all'intervallo definito nel vincolo CHECK.

Messaggio 547, livello 16, stato 0, riga 13 L'istruzione INSERT era in conflitto con il vincolo CHECK "CK__Employee__Age__3B0BC30C". Il conflitto si è verificato nel database "VishLearningDB", nella tabella "dbo.Employee", nella colonna "Age". La dichiarazione è stata chiusa. 

c. Aggiungi un dipendente la cui età è 26.

INSERISCI I valori di Employee (EmployeeId, Name, Salary, Gender, Age) (103, 'Mani', 329999.00, 'F', 15); (1 riga (e) interessata) 

Il valore è stato inserito correttamente.

Aggiungi un vincolo CHECK su una tabella esistente

Ora, vogliamo assicurarci che la nostra colonna di genere consenta solo i valori M (maschio) e F (femmina).

Creeremo un vincolo di controllo.

Sintassi

ALTER TABLE ADD Vincolo  DAI UN'OCCHIATA () 

Esempio

ALTER TABLE Employee ADD Constraint CK_Employee_Gender CHECK (Gender = 'M' OR GENDER = 'F'); 

Inseriamo un altro dipendente maschio e femmina.

INSERISCI I valori di Employee (EmployeeId, Name, Salary, Gender, Age) (104, 'Meera', 23000.00, 'F', 26); INSERISCI I valori di Employee (EmployeeId, Name, Salary, Gender, Age) (105, 'Shailesh', 24000.00, 'M', 28); (1 riga (e) interessata) (1 riga (e) interessata) 

È stato inserito con successo.

Ora proveremo ad inserire un altro personaggio nella colonna Gender.

INSERISCI I valori di Employee (EmployeeId, Name, Salary, Gender, Age) (105, 'Vish', 24000.00, 'V', 28); 

Il vincolo di controllo ha l'errore sotto.

Messaggio 547, livello 16, stato 0, riga 31 L'istruzione INSERT era in conflitto con il vincolo CHECK "CK_Employee_Gender". Il conflitto si è verificato nel database "master", nella tabella "dbo.Employee", nella colonna "Gender". La dichiarazione è stata chiusa. 

Aggiungi un VERIFICARE Vincolo l'opzione CON NOCHECK

Cosa succede se abbiamo già inserito alcuni valori che non sono conformi al nuovo vincolo di controllo? Supponiamo che nella colonna Salario abbiamo inserito una voce errata con uno stipendio di $ -2300,00. Ora, vogliamo implementare un vincolo check in modo che la colonna Salary accetti solo valori maggiori di zero.

Cercheremo di aggiungere un vincolo di controllo all'opzione WITH NOCHECK.

Innanzitutto, inserire un dipendente con uno stipendio di -2300,00.

INSERISCI I valori di Employee (EmployeeId, Name, Salary, Gender, Age) (105, 'Vish', -2300.00, 'M', 28); 

Ora prova ad aggiungere un vincolo Verifica come sopra sintassi.

ALTER TABLE Employee ADD Constraint CK_Employee_Salary CHECK (Salary> 0); 

Non riesce e restituisce il seguente messaggio di errore perché i valori esistenti non sono conformi alla condizione del vincolo di controllo.

L'istruzione ALTER TABLE era in conflitto con il vincolo CHECK "CK_Employee_Salary". Il conflitto si è verificato nel database "VishLearningDB", nella tabella "dbo.Employee", nella colonna "Salary". 

Nel caso precedente, possiamo ancora creare un vincolo di controllo usando WITH NOCHECK. Ciò non convaliderà i dati esistenti rispetto alla nuova condizione del vincolo di controllo.

ALTER TABLE Dipendente CON NOCHECK ADD Vincolo CK_Employee_Salary CHECK (Salary> 0); 

Leggi di più su SQL Server dagli archivi Tech-Recipes.