Aller au contenu
Contraintes & intégrité

UNIQUE, NOT NULL, CHECK

Ces contraintes refusent les données invalides dès l'écriture : NOT NULL impose une valeur, UNIQUE interdit les doublons, CHECK valide une règle métier comme une remise comprise entre 1 et 50 %.

  • unicité
  • validation
  • contrainte
  • DEFAULT
  • NULLS NOT DISTINCT

Syntaxe

Modèle
col TYPE NOT NULLcol TYPE UNIQUEcol TYPE CHECK (expression)col TYPE DEFAULT valeur

Exemple

Exemple concret
CREATE TABLE coupons (  id INTEGER PRIMARY KEY,  code TEXT NOT NULL UNIQUE,  discount_pct INTEGER NOT NULL CHECK (discount_pct BETWEEN 1 AND 50),  customer_id INTEGER UNIQUE REFERENCES customers(id));INSERT INTO coupons (code, discount_pct) VALUES ('BIENVENUE', 10), ('ETE24', 15);INSERT INTO coupons (code, discount_pct) VALUES ('MEGA', 80);-- Jeu de données : boutique-- Les deux premiers coupons passent, avec customer_id NULL deux fois malgré UNIQUE.-- Le troisième viole la règle des 50 %.-- Résultat attendu : erreur « CHECK constraint failed: discount_pct BETWEEN 1 AND 50 »

À retenir

  1. Piège : UNIQUE accepte plusieurs NULL dans SQLite et PostgreSQL, car deux NULL ne sont pas considérés comme égaux. SQL Server n'en accepte qu'un. PostgreSQL 15+ propose UNIQUE NULLS NOT DISTINCT pour n'en autoriser qu'un.
  2. Piège : un CHECK dont la condition vaut NULL est considéré comme respecté. CHECK (discount_pct <= 50) laisse passer NULL : combinez avec NOT NULL.
  3. DEFAULT fournit une valeur quand la colonne est omise à l'insertion (DEFAULT 0, DEFAULT CURRENT_TIMESTAMP), mais n'empêche pas d'insérer explicitement NULL.
  4. Nommez vos contraintes, CONSTRAINT ck_remise CHECK (…), pour obtenir des messages d'erreur explicites et pouvoir les supprimer dans PostgreSQL.

Voir aussi