Les contraintes (constraints) sont des limitations d'intégrité qui sont appliquées aux colonnes ou aux tables pour contrôler automatiquement la validité des valeurs. Elles permettent de :
Types de contraintes principales :
PRIMARY KEY — identifiant unique, empêche la duplication et les valeurs NULL.UNIQUE — empêche la duplication des valeurs dans une même colonne.FOREIGN KEY — intégrité référentielle, lien avec une autre table.CHECK — vérification d'une expression arbitraire.NOT NULL — interdiction des valeurs NULL dans la colonne.CREATE TABLE orders ( id SERIAL PRIMARY KEY, user_id INT REFERENCES users(id), -- clé étrangère price DECIMAL(10,2) CHECK (price > 0), created_at TIMESTAMP NOT NULL );
"La clé unique (UNIQUE) est-elle automatiquement SAFE NULL, excluant un nombre quelconque de valeurs NULL dans la colonne ?"
En réalité, dans la plupart des SGBD (par exemple, PostgreSQL, MySQL), la contrainte UNIQUE permet plusieurs lignes avec la valeur NULL, car NULL est considéré comme "inconnu". Cela entraîne souvent une duplication non remarquée des valeurs vides.
CREATE TABLE test ( id INT PRIMARY KEY, code VARCHAR(10) UNIQUE ); INSERT INTO test (id, code) VALUES (1, NULL), (2, NULL); -- réussi
Histoire
L'application permettait l'inscription par email, la colonne était UNIQUE, mais PAS NOT NULL — une dizaine d'utilisateurs avaient un email NULL dans la table, ce qui a causé des problèmes lors de l'intégration avec des services externes.
Histoire
Dans le système de commande de billets, on a oublié d'ajouter la clé étrangère à la table des paiements — en conséquence, des paiements sont apparus sans aucun lien avec une commande, ce qui a compliqué les remboursements aux utilisateurs.
Histoire
Contrainte CHECK pour la remise : discount > 0. Une situation limite pour 0 a été oubliée. Résultat : le système n'acceptait que les remises supérieures à 0, et l'absence de remise (0) a cassé la logique métier.