Visualiseur — Contrainte UNIQUE SQL
Une contrainte UNIQUE empêche les doublons sur une colonne (ou plusieurs). Chaque valeur dans la colonne doit être différente des autres. Naviguez les étapes pour voir ce qui est accepté et ce qui est rejeté.
L’outil propose trois onglets correspondant chacun à un cas d’usage distinct de la contrainte UNIQUE. Chaque onglet affiche une séquence de 4 étapes navigables avec les boutons Étape suivante et Étape précédente. La ligne SQL active est mise en surbrillance verte dans le bloc de code, et une bannière verte ou rouge indique immédiatement si l’opération est acceptée ou rejetée.
- Onglet 1 — UNIQUE simple : contrainte sur une seule colonne
emaildans la tableutilisateurs_simple. - Onglet 2 — UNIQUE multicolonnes : contrainte portant sur le couple de colonnes
(jour, plage)dans la tableouvertures. - Onglet 3 — UNIQUE + NULL : comportement de
UNIQUEface aux valeursNULLdans la tableutilisateurs_null.
Ce que fait la contrainte UNIQUE
La contrainte UNIQUE interdit qu’une même valeur apparaisse deux fois dans la colonne concernée. Elle garantit que chaque enregistrement est identifiable par cette colonne, sans qu’une clé primaire soit nécessaire. Un email d’utilisateur, un numéro de téléphone ou un code produit sont des exemples typiques de colonnes qui doivent être uniques sans être des identifiants techniques.
La contrainte UNIQUE est vérifiée par le moteur à chaque INSERT et UPDATE. Si la valeur soumise existe déjà dans la table, la commande est rejetée intégralement et aucune ligne n’est modifiée. Ce contrôle automatique évite d’écrire des validations manuelles côté applicatif pour garantir l’unicité.
UNIQUE et PRIMARY KEY partagent la même logique d’unicité, mais une table peut avoir plusieurs colonnes UNIQUE alors qu’elle ne possède qu’une seule clé primaire. De plus, UNIQUE autorise les valeurs NULL selon certaines conditions, ce que PRIMARY KEY n’autorise jamais. C’est précisément cette nuance autour de NULL que le troisième onglet de l’outil illustre.
Scénario 1 : UNIQUE sur une colonne email
La table utilisateurs_simple déclare email VARCHAR(100) UNIQUE. Les deux premiers INSERT avec alice@site.com et bob@site.com sont acceptés car ces valeurs sont distinctes. Le troisième INSERT tente de réutiliser alice@site.com pour un utilisateur différent : la contrainte est violée, la table reste inchangée, et la bannière rouge ❌ INSERT REJETÉ — doublon email s’affiche.
-- Création de la table avec UNIQUE sur email
CREATE TABLE utilisateurs_simple (
id INT,
email VARCHAR(100) UNIQUE,
nom VARCHAR(50)
);
-- ✅ Accepté — email inexistant dans la table
INSERT INTO utilisateurs_simple VALUES (1, 'alice@site.com', 'Alice');
INSERT INTO utilisateurs_simple VALUES (2, 'bob@site.com', 'Bob');
-- ❌ Rejeté — alice@site.com existe déjà
INSERT INTO utilisateurs_simple VALUES (3, 'alice@site.com', 'AliceDuplicate');
-- Erreur : Duplicate entry 'alice@site.com' for key 'email'
Scénario 2 : UNIQUE sur plusieurs colonnes
La contrainte UNIQUE (jour, plage) porte sur la combinaison des deux colonnes, pas sur chacune individuellement. La valeur Lundi peut donc apparaître plusieurs fois dans la colonne jour, à condition que la plage horaire associée soit différente. Ce comportement est impossible à comprendre intuitivement sans visualisation : deux lignes avec jour = 'Lundi' semblent être des doublons, alors qu’elles sont parfaitement valides si leurs plage diffèrent.
L’outil montre que ('Lundi', '09h-12h') et ('Lundi', '13h-17h') sont tous les deux acceptés. Tenter d’insérer un troisième créneau ('Lundi', '09h-12h') échoue car le couple exact existe déjà. C’est le couple qui doit être unique, non la valeur isolée de chaque colonne.
-- Contrainte UNIQUE sur deux colonnes combinées
CREATE TABLE ouvertures (
id INT,
jour VARCHAR(10),
plage VARCHAR(20),
UNIQUE (jour, plage)
);
-- ✅ Accepté — couples distincts
INSERT INTO ouvertures VALUES (1, 'Lundi', '09h-12h');
INSERT INTO ouvertures VALUES (2, 'Lundi', '13h-17h');
-- ❌ Rejeté — le couple ('Lundi','09h-12h') existe déjà
INSERT INTO ouvertures VALUES (3, 'Lundi', '09h-12h');
Scénario 3 : UNIQUE face aux valeurs NULL
Ce troisième scénario couvre le cas le plus méconnu et le plus source d’erreurs : le comportement de UNIQUE lorsque la colonne contient des valeurs NULL. Insérer un premier NULL est accepté par tous les SGBD. Insérer un deuxième NULL dans la même colonne UNIQUE est en revanche rejeté par certains moteurs comme SQL Server, qui considèrent que deux NULL constituent un doublon. D’autres moteurs comme MySQL ou PostgreSQL autorisent plusieurs NULL dans une colonne UNIQUE, car NULL est par définition une absence de valeur et ne peut pas être comparée à elle-même.
-- Création de la table avec UNIQUE + colonne nullable
CREATE TABLE utilisateurs_null (
id INT,
email VARCHAR(100) UNIQUE,
nom VARCHAR(50)
);
-- ✅ Accepté sur tous les SGBD
INSERT INTO utilisateurs_null VALUES (1, 'alice@site.com', 'Alice');
-- ✅ Accepté sur tous les SGBD — premier NULL
INSERT INTO utilisateurs_null VALUES (2, NULL, 'Bob');
-- ⚠️ Comportement variable selon le SGBD
-- MySQL / PostgreSQL : ✅ accepté — NULL ≠ NULL
-- SQL Server : ❌ rejeté — deux NULL = doublon
INSERT INTO utilisateurs_null VALUES (3, NULL, 'Claire');
ARTICLES LIÉS
SQL INSERT INTO: Comment insérer des données dans une table en SQL ?
La commande SQL INSERT INTO ajoute une ou plusieurs lignes de données dans une table existante d’une base de données relationnelle. Syntaxe de baseComparaison des syntaxesComment insérer une seule ligne en SQL ?Comment insérer plusieurs lignes en même temps ?Comment copier des données en SQL ?Différence entre INSERT INTO et INSERT…