Guide du débutant sur les contraintes de vérification dans SQL Server

Au cours de ma scolarité, un de mes professeurs a déclaré: «Un de mes amis a obtenu 105 points sur un test scientifique sur 100. Je me demandais comment il était possible d’en obtenir 105 sur 100. Dans ce cas, la valeur a été gonflée. Plus tard, il a été révélé que le score était une erreur de calcul. Son score était de 97. Dans certains contextes, une plage de valeurs est définie et aucune valeur ne doit dépasser la plage définie. »

Le même concept s'applique pour vérifier les contraintes dans SQL Server. Considérons l'âge d'un employé comme un type de données entier pour une colonne d'une table d'employés. Un des employés a entré le nombre -76 (négatif 76) dans la colonne Âge. Dans le contexte de l'âge, il n'est pas possible d'avoir l'âge en nombre négatif. Le serveur SQL ne génère aucune erreur car les valeurs négatives sont acceptables dans un type de données entier. Pour éviter cela, la colonne Âge ne doit accepter que des nombres positifs. Cela peut être accompli en ajoutant une contrainte de vérification sur la colonne Age pour la table employee. Commençons.

Créer une table d'employés avec des contraintes de vérification

Pour l'entreprise ABC, conformément à leurs politiques, les employés doivent avoir au moins 18 ans pour travailler pour eux. Par conséquent, nous allons ajouter une contrainte de vérification lors de la création de la table employee afin de nous assurer que les âges des employés sont toujours supérieurs ou égaux à 18.

SI OBJECT_ID (N'Employee ', N'U') N'EST PAS NULL DROP TABLE Employee; CREATE TABLE Employee (Clé Primaire INT EmployeeId, Salaire Numérique (18,2), Caractère de sexe (1), Âge CHECK INT (Âge> = 18) - Contrôler la condition de contrainte); 

La condition VÉRIFICATION (ÂGE> = 18) ajoute une contrainte de vérification sur la table employee avec une condition dans laquelle l'âge d'un employé devrait être supérieur ou égal à 18 ans.

Nous allons essayer d’insérer des enregistrements pour nous assurer que notre contrainte de vérification fonctionne.

une. Ajoutez un employé de 18 ans.

INSERT INTO Employee (ID employé, nom, salaire, sexe, âge), valeurs (100, 'Niraj', 67000.00, 'M', 18); (1 rangée (s) affectée (s)) 

L'âge a été inséré avec succès.

b. Ajoutez un employé de 15 ans qui ne respecte pas la plage de contrainte de vérification.

INSERT INTO Employee (valeurs de l'employé (nom d'employé, nom, salaire, sexe, âge)) (101, «Chetan», 56000.00, «M», 15); 

SQL Server a généré l'erreur ci-dessous car Age = 15 est inférieur à la plage définie dans la contrainte CHECK.

Msg 547, niveau 16, état 0, ligne 13 L'instruction INSERT était en conflit avec la contrainte CHECK "CK__Employee__Age__3B0BC30C". Le conflit s'est produit dans la base de données "VishLearningDB", table "dbo.Employee", colonne "Age". La déclaration a été terminée. 

c. Ajoutez un employé de 26 ans.

INSERT INTO Employee (valeurs de l'employé (nom d'employé, nom, salaire, sexe, âge)) (103, «Mani», 329999.00, «F», 15); (1 rangée (s) affectée (s)) 

La valeur a été insérée avec succès.

Ajouter une contrainte CHECK sur une table existante

Maintenant, nous voulons nous assurer que notre colonne Genre ne permet que les valeurs M (homme) et F (femme).

Nous allons créer une contrainte de vérification.

Syntaxe

ALTER TABLE ADD Contrainte  VÉRIFIER () 

Exemple

ALTER TABLE CONTRAINT Employé CK_Employee_Gender CHECK (Sexe = 'M' OU GENRE = 'F'); 

Insérons un autre employé masculin et féminin.

INSERT INTO Employee (valeurs de l'employé (nom d'employé, nom, salaire, sexe, âge)) (104, 'Meera', 23000.00, 'F', 26); INSERT INTO Employee (valeurs de l'employé (nom d'employé, nom, salaire, sexe, âge)) (105, 'Shailesh', 24000.00, 'M', 28); (1 ligne (s) affectée (s) (1 ligne (s) affectée (s)) 

Il a été inséré avec succès.

Nous allons maintenant essayer d'insérer un autre personnage dans la colonne Sexe.

INSERT INTO Employee (valeurs de l'employé (nom d'employé, nom, salaire, sexe, âge)) (105, 'Vish', 24000.00, 'V', 28); 

La contrainte de vérification a l'erreur ci-dessous.

Msg 547, niveau 16, état 0, ligne 31 L'instruction INSERT était en conflit avec la contrainte CHECK "CK_Employee_Gender". Le conflit s'est produit dans la base de données "maître", table "dbo.Employee", colonne "Genre". La déclaration a été terminée. 

Ajouter une contrainte de vérification de l'option WITH NOCHECK

Et si nous avons déjà inséré des valeurs qui ne sont pas conformes à la nouvelle contrainte de vérification? Supposons que dans la colonne Salary, nous ayons inséré une mauvaise entrée avec un salaire égal à -2300,00 $. Maintenant, nous voulons implémenter une contrainte de vérification afin que la colonne Salaire n'accepte que les valeurs supérieures à zéro.

Nous allons essayer d’ajouter une contrainte de vérification à l’option WITH NOCHECK.

Tout d'abord, insérez un employé avec un salaire de -2300.00.

INSERT INTO Employee (valeurs de l'employé (nom d'employé, nom, salaire, sexe, âge)) (105, «Vish», -2300,00, «M», 28); 

Maintenant, essayez d’ajouter une contrainte de vérification selon la syntaxe ci-dessus.

ALTER TABLE Employé ADD Contrainte CK_Employee_Salary CHECK (Salaire> 0); 

Il échoue et donne le message d'erreur ci-dessous car les valeurs existantes ne sont pas conformes à la condition de contrainte de vérification.

L'instruction ALTER TABLE était en conflit avec la contrainte CHECK "CK_Employee_Salary". Le conflit s'est produit dans la base de données "VishLearningDB", table "dbo.Employee", colonne "Salary". 

Dans le cas ci-dessus, nous pouvons toujours créer une contrainte de vérification en utilisant WITH NOCHECK. Cela ne validera pas les données existantes par rapport à la nouvelle condition de contrainte de vérification.

ALTER TABLE Employé AVEC NOCHECK AJOUTER Contrainte CK_Employee_Salary CHECK (Salaire> 0); 

Lire la suite sur SQL Server à partir des archives Tech-Recipes.