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
col TYPE NOT NULLcol TYPE UNIQUEcol TYPE CHECK (expression)col TYPE DEFAULT valeurExemple
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
- 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.
- 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.
- 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.
- Nommez vos contraintes, CONSTRAINT ck_remise CHECK (…), pour obtenir des messages d'erreur explicites et pouvoir les supprimer dans PostgreSQL.
Voir aussi
- PRIMARY KEYLa clé primaire identifie chaque ligne de façon unique et stable : jamais deux fois la même valeur, jamais NULL. C'est elle que référencent les clés étrangères des autres tables.
- CREATE TABLECREATE TABLE déclare une nouvelle table : ses colonnes, leurs types et les contraintes qui protègent les données. C'est la traduction concrète d'un modèle MLD en schéma de base.
- UPSERT (ON CONFLICT)Un UPSERT insère une ligne ou, si sa clé existe déjà, met à jour la ligne en place. C'est la façon sûre de synchroniser un catalogue ou un import sans tester l'existence au préalable.
- FOREIGN KEYUne clé étrangère garantit qu'une valeur pointe vers une ligne qui existe dans une autre table, comme l'élève d'une absence. Elle empêche les références orphelines et encadre les suppressions.