Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Ajouter une contrainte CHECK à une table existante dans SQL Server (T-SQL)

Cet article montre comment ajouter un CHECK contrainte à une table existante.

Vous pouvez ajouter une contrainte à une table existante en utilisant ALTER TABLE avec la ADD CONSTRAINT argument. Exemples ci-dessous.

Exemple 1 - Créer le tableau

Commençons par créer une table pour laquelle nous ajouterons le CHECK contrainte.

CREATE TABLE Event
(
  EventId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
  EventName varchar(255) NOT NULL,
  StartDate date NOT NULL,
  EndDate date NOT NULL,
  Price smallmoney NOT NULL
);

Exemple 2 – Ajouter une contrainte au niveau de la colonne

Ajoutons maintenant un CHECK contrainte sur le Prix colonne.

ALTER TABLE Event
  ADD CONSTRAINT chkPrice CHECK (Price > 0);

Cette contrainte garantira que le prix est toujours supérieur à zéro.

Maintenant que la contrainte a été ajoutée, voici ce qui se passe si nous essayons d'insérer des données invalides :

INSERT INTO Event ( EventName, StartDate, EndDate, Price )
VALUES ( 'ICCC 2020', '2020-01-01', '2020-02-02', 0 );

Résultat :

Msg 547, Level 16, State 0, Line 1
The INSERT statement conflicted with the CHECK constraint "chkPrice". The conflict occurred in database "EMS", table "dbo.Event", column 'Price'.

Dans ce cas, le CHECK contrainte spécifie que toutes les données du Price doit être supérieur à 0. En d'autres termes, le prix ne peut pas être nul et il ne peut pas être négatif.

C'est ce qu'on appelle une contrainte au niveau de la colonne , car il est défini sur une seule colonne. Il s'applique aux données d'une colonne.

Exemple 3 – Ajouter une contrainte au niveau de la table

Ajoutons maintenant un CHECK au niveau de la table contrainte. Cela vérifiera les données dans deux colonnes.

ALTER TABLE Event
  ADD CONSTRAINT chkEndDate 
  CHECK (EndDate >= StartDate);

Dans ce cas, j'ajoute une contrainte pour garantir que la date de fin ne peut jamais être antérieure à la date de début. Ceci vérifie les données sur deux colonnes et est donc une contrainte au niveau de la table.

Essayez d'insérer une valeur invalide :

INSERT INTO Event ( EventName, StartDate, EndDate, Price )
VALUES ( 'ICCC 2020', '2020-01-01', '1970-02-02', 150.00 );

Résultat :

Msg 547, Level 16, State 0, Line 1
The INSERT statement conflicted with the CHECK constraint "chkEndDate". The conflict occurred in database "EMS", table "dbo.Event".

Comme prévu, l'opération échoue, car ma date de fin est antérieure à la date de début.

Notez que pour tester cette contrainte, j'ai dû augmenter le prix à une valeur valide afin d'éviter que la contrainte précédente ne se déclenche en premier (CHECK les contraintes sont validées dans l'ordre de leur création).

Exemple 4 - Insertion réussie de données conformes à la contrainte

Afin d'insérer une ligne avec succès, tout ce que nous devons faire est de nous assurer que nous insérons des valeurs valides.

Exemple :

INSERT INTO Event ( EventName, StartDate, EndDate, Price )
VALUES ( 'ICCC 2020', '2020-01-01', '2020-02-02', 150.00 );

SELECT * FROM Event;

Résultat :

+-----------+-------------+-------------+------------+----------+
| EventId   | EventName   | StartDate   | EndDate    | Price    |
|-----------+-------------+-------------+------------+----------|
| 4         | ICCC 2020   | 2020-01-01  | 2020-02-02 | 150.0000 |
+-----------+-------------+-------------+------------+----------+

Notez que l' EventId la colonne a déjà augmenté à 4. C'est parce qu'il s'agit d'un IDENTITY colonne. Une chose importante à retenir à propos de IDENTITY colonnes est qu'elles s'incrémentent même lorsqu'une contrainte provoque un INSERT l'opération échoue.

Quelques restrictions des contraintes CHECK

Voici quelques restrictions à prendre en compte lorsque vous travaillez avec CHECK contraintes :

  • La condition de recherche doit correspondre à une expression booléenne et ne peut pas faire référence à une autre table.
  • L'expression ne peut pas contenir de types de données d'alias.
  • CHECK les contraintes ne peuvent pas être définies sur le texte , texte , ou image colonnes.