Deux élèves peuvent porter le même nom. Comment la base sait-elle de quelle ligne tu parles ? Identifiant naturel ou artificiel, clé primaire, et les contraintes qui empêchent les doublons et les cases vides.
Une table peut contenir des milliers de lignes. Pour corriger l'une d'elles, la relier à autre chose ou simplement en parler, il faut pouvoir la désigner sans hésitation. Cet article montre comment on donne à chaque ligne une identité, et comment la base la protège.
💡 Télécharge
mon-ecole-depart.dbdans la sidebar et ouvre-la dans DB Browser for SQLite. Elle contient une tableelevede douze élèves, avec une colonneidqui numérote les lignes.
À la fin de cet article, tu seras capable de :
NOT NULL et UNIQUE avec DB Browser et vérifier qu'elles fonctionnent.Deux nouveaux élèves arrivent à l'école. Par hasard, ils s'appellent tous les deux Lucas Adam et sont nés le même jour.
nom | prenom | date_naissance | commune
-----+--------+----------------+---------
Adam | Lucas | 2010-03-12 | Jodoigne
Adam | Lucas | 2010-03-12 | Jodoigne
Essaie de répondre à ces questions :
C'est impossible. Rien dans ces lignes ne permet de les distinguer. Le problème n'est pas qu'elles se ressemblent : c'est qu'aucune information ne désigne une ligne et une seule.
📖 Nouvelle notion : l'identifiant
Un identifiant est une information qui désigne une ligne et une seule. Deux lignes ne peuvent jamais avoir le même identifiant. Grâce à lui, on peut retrouver, corriger ou relier une ligne précise.
En anglais : 🇬🇧 identifier.
Certaines choses possèdent déjà un numéro unique dans la vie réelle.
| Ce qu'on identifie | Son identifiant dans la vie réelle |
|---|---|
| un citoyen belge | le numéro de registre national |
| un livre publié | l'ISBN |
| un produit en magasin | le code-barres |
| une voiture | la plaque d'immatriculation |
| un pays | son code à deux lettres (BE, FR) |
📖 Nouvelle notion : l'identifiant naturel
Un identifiant naturel est une information qui existe en dehors de la base et qui est déjà unique : un ISBN, une plaque d'immatriculation. Il a du sens pour tout le monde.
En anglais : 🇬🇧 natural key.
L'autre solution consiste à inventer un numéro qui n'existe que dans la base : 1 pour le premier élève encodé, 2 pour le suivant, et ainsi de suite. C'est le rôle de la colonne id.
📖 Nouvelle notion : l'identifiant artificiel
Un identifiant artificiel est un numéro créé uniquement pour la base de données. Il ne veut rien dire en dehors d'elle, et c'est justement sa force : comme il ne décrit rien, il n'a jamais de raison de changer.
En anglais : 🇬🇧 surrogate key.
Un bon identifiant respecte quatre critères. S'il en rate un seul, il finira par poser problème.
| Critère | La question à se poser |
|---|---|
| Unique | Deux éléments peuvent-ils avoir la même valeur ? |
| Obligatoire | Peut-il manquer, ne serait-ce qu'une fois ? |
| Stable | Peut-il changer au cours du temps ? |
| Non signifiant | Contient-il une information qui pourrait devenir fausse ? |
Appliquons ces critères aux candidats pour identifier un élève :
| Candidat | Unique | Obligatoire | Stable | Verdict |
|---|---|---|---|---|
nom |
❌ plusieurs Dubois | ✅ | ⚠️ un mariage, une adoption | inutilisable |
nom + prenom |
❌ deux Lucas Adam | ✅ | ⚠️ | inutilisable |
email |
✅ | ❌ 3 élèves n'en ont pas | ⚠️ une adresse change | non |
| numéro national | ✅ | ✅ | ✅ | bon… mais donnée sensible |
id |
✅ | ✅ | ✅ | oui |
⚠️ Le numéro national est un bon identifiant sur le papier, et un mauvais choix en pratique. C'est une donnée personnelle protégée par le RGPD, la loi européenne sur la protection des données. On ne la collecte que si on en a vraiment besoin, jamais « au cas où ». Un
idinventé fait le même travail sans aucun risque.
🧠 La règle du parcours.
Chaque table a pour identifiant un numéro artificiel
id. Si un identifiant naturel existe, comme l'adresse e-mail, on le garde dans une colonne ordinaire et on interdit les doublons dans cette colonne.
Ouvre l'onglet Structure de la base et déplie la table eleve. La colonne id porte une petite clé : c'est la clé primaire de la table.
📖 Nouvelle notion : la clé primaire
La clé primaire est la colonne choisie comme identifiant officiel d'une table. La base garantit que sa valeur est unique et jamais vide. Une table n'a qu'une seule clé primaire.
En anglais : 🇬🇧 primary key, souvent abrégé PK.
Dans le SQL de la table, elle apparaît sur la dernière ligne :
CREATE TABLE "eleve" (
"id" INTEGER,
"nom" TEXT,
...
PRIMARY KEY("id")
);
PRIMARY KEY se traduit littéralement par « clé principale ».
Essaie de tricher. Dans Parcourir les données, double-clique sur l'id d'Emma Bastin (le 2) et remplace-le par 1, qui appartient déjà à Lucas Adam.
DB Browser refuse la modification et affiche un message qui contient :
UNIQUE constraint failed: eleve.id
Traduit mot à mot : « contrainte d'unicité non respectée : eleve.id ». La base vient de refuser une donnée qui aurait cassé une règle.
📖 Nouvelle notion : la contrainte
Une contrainte est une règle attachée à une table, que la base vérifie à chaque ajout ou modification. Si une donnée ne respecte pas la règle, la base la refuse et affiche un message d'erreur.
En anglais : 🇬🇧 constraint.
Quand tu insères une ligne sans donner d'id, SQLite choisit lui-même le numéro : le plus grand id présent dans la table, plus un. C'est pour ça que la colonne se remplit toute seule dans DB Browser.
Conséquence : si tu supprimes une ligne au milieu de la table, son numéro laisse un trou qui ne sera jamais rebouché.
avant : 1, 2, 3, 4, 5
on supprime la ligne 3
après : 1, 2, 4, 5
on ajoute une ligne : elle reçoit 6
⚠️ Les trous dans la numérotation sont normaux. Un identifiant sert à désigner une ligne, pas à compter les lignes. Ne cherche jamais à « renuméroter proprement » : tout ce qui faisait référence à l'ancien numéro désignerait soudain une autre ligne.
💡 Et la case AI ? DB Browser propose une case AI, pour
AUTOINCREMENT, et tu la verras dans beaucoup d'exemples sur internet. En SQLite, elle est inutile : une colonneINTEGERen clé primaire se numérote déjà toute seule. Laisse-la décochée.
Pour l'instant, rien n'empêche d'enregistrer un élève sans nom. Une ligne sans nom n'a pourtant aucun sens.
📖 Nouvelle notion : la contrainte NOT NULL
La contrainte NOT NULL interdit qu'une colonne reste sans valeur. Toute ligne doit obligatoirement y contenir quelque chose.
En anglais : not null, « pas nul », c'est-à-dire « jamais vide ».
Pose-la sur nom et prenom :
eleve, puis Modifier la table.nom, puis sur celle de prenom.Vérifie que la contrainte fonctionne. Dans Parcourir les données, fais un clic droit sur le prénom de Noah Charlier et choisis Définir comme NULL. DB Browser refuse et affiche :
NOT NULL constraint failed: eleve.prenom
⚠️ Une case vidée n'est pas une case NULL. Si tu effaces le texte d'une case au clavier, DB Browser y range un texte vide
'', qui compte comme une valeur.NOT NULLle laisse passer. Seule l'absence totale de valeur est refusée.
L'adresse e-mail est un identifiant naturel : deux élèves ne partagent jamais la même. On ne l'utilise pas comme clé primaire, mais on veut quand même empêcher les doublons.
📖 Nouvelle notion : la contrainte UNIQUE
La contrainte UNIQUE interdit que deux lignes aient la même valeur dans une colonne. Contrairement à la clé primaire, une table peut avoir plusieurs colonnes
UNIQUE, et ces colonnes peuvent rester vides.En anglais : unique, « unique ».
Pose-la sur email : Modifier la table, coche U sur la ligne de email, OK, puis Ctrl+S.
Vérifie : copie l'adresse de Lucas Adam (lucas.adam@ecole.be) dans la case e-mail d'Emma Bastin. DB Browser refuse :
UNIQUE constraint failed: eleve.email
Maintenant, observe les élèves sans adresse e-mail : Noah Charlier, Chloé Fontaine et Camille Jacques ont tous les trois NULL. La contrainte a pourtant été acceptée.
🧠 UNIQUE accepte plusieurs NULL. Pour la base, deux valeurs inconnues ne sont pas égales : on ne peut pas affirmer que deux choses qu'on ignore sont identiques. Si tu veux « pas de doublon et toujours rempli », il faut cocher NN et U.
| Clé primaire | UNIQUE | |
|---|---|---|
| Combien par table ? | une seule | autant qu'on veut |
| Case vide autorisée ? | non | oui, même plusieurs fois |
| Rôle | l'identifiant officiel de la ligne | une protection contre les doublons |
Regarde enfin le SQL de la table dans Structure de la base. Tes clics y ont ajouté les contraintes :
CREATE TABLE "eleve" (
"id" INTEGER,
"nom" TEXT NOT NULL,
"prenom" TEXT NOT NULL,
"date_naissance" TEXT,
"commune" TEXT,
"email" TEXT UNIQUE,
"absences" INTEGER,
PRIMARY KEY("id")
);
Ta base correspond maintenant à mon-ecole-eleves.db, disponible dans la sidebar.
⚠️ On ne pose pas une contrainte sur des données déjà fausses. Si deux élèves avaient eu la même adresse e-mail, DB Browser aurait refusé de poser
UNIQUE. C'est une bonne nouvelle : la base t'aurait signalé un problème. Il faut alors corriger les données avant de contraindre.
Pour chaque proposition, dis si elle ferait un bon identifiant. Si ce n'est pas le cas, nomme le critère qu'elle rate.
| Table | Identifiant proposé |
|---|---|
eleve |
l'adresse du domicile |
livre |
l'ISBN |
voiture |
la plaque d'immatriculation |
commune |
le code postal |
professeur |
les initiales (LL, SD) |
article |
le nom du produit |
classe |
le nom de la classe (4TTR) |
💡 Pour le code postal : plusieurs communes partagent parfois le même, et certaines villes en ont plusieurs. Qu'en conclus-tu ?
Travaille sur une copie de ta base. Pour chaque cas, fais la manipulation dans Parcourir les données et recopie le message exact.
id d'un autre élève.Termine par Annuler les modifications.
Crée une base d'essai avec une table joueur (id, pseudo), où id est une clé primaire INTEGER.
id.3 (bouton Supprimer l'enregistrement), puis insère un nouveau joueur. Quel id reçoit-il ?id reçoit-il cette fois ? Explique la différence avec la question 2.L'école veut gérer ses manuels : ISBN, titre, éditeur, année de parution et nombre d'exemplaires.
manuel et souligne la clé primaire.X.Un collègue a créé une table contact (nom, prenom, email) sans clé primaire. Elle contient déjà 300 lignes, dont quelques doublons.
email ?id.INTEGER ; les trous dans la numérotation sont normaux.NOT NULL interdit l'absence de valeur, UNIQUE interdit les doublons mais accepte plusieurs NULL.Ta table est prête et protégée. Dans l'article Lister le contenu d'une table, tu poses ta première question à la base en SQL.