La table des professeurs existe mais elle est vide. Tu y ajoutes des lignes en SQL, une par une puis plusieurs à la fois, tu observes ce que la base refuse, et tu importes un fichier CSV.
Six professeurs doivent entrer dans la base de l'école. Tu en encodes un à la main, puis trois d'un coup. Les deux derniers arrivent dans un fichier envoyé par le secrétariat. À chaque étape, la base vérifie ce que tu lui donnes, et elle n'hésite pas à refuser.
💡 Fichiers de départ
Télécharge dans la barre latérale
mon-ecole-eleves.db(la tableeleveavec 12 élèves) etnouveaux-professeurs.csv(le fichier du secrétariat). Ouvre la base dans DB Browser for SQLite. Le SQL s'écrit dans l'onglet Exécuter le SQL.
À la fin de cet article, tu seras capable de :
INSERT INTO … VALUES, en nommant les colonnes.INSERT … SELECT.La base téléchargée ne contient pas encore de table pour les professeurs. Exécute ce script. Il ne crée la table que si elle n'existe pas encore : IF NOT EXISTS veut dire si elle n'existe pas.
CREATE TABLE IF NOT EXISTS professeur (
id INTEGER PRIMARY KEY,
nom TEXT NOT NULL,
prenom TEXT NOT NULL,
email TEXT NOT NULL UNIQUE,
actif INTEGER NOT NULL DEFAULT 1,
telephone TEXT
);
En deux lignes, ce que disent ces règles. INTEGER PRIMARY KEY donne à chaque professeur un numéro unique, que SQLite attribue tout seul. NOT NULL rend une colonne obligatoire, UNIQUE interdit deux fois la même adresse, et DEFAULT 1 écrit 1 dans actif quand on ne précise rien.
Vérifie que la table est vide :
SELECT * FROM professeur;
id | nom | prenom | email | actif | telephone
---+-----+--------+-------+-------+----------
⚠️ Si la table existait déjà et contient des lignes, retélécharge
mon-ecole-eleves.db: les résultats de cet article supposent une table vide au départ.
Sophie Dubois est la première à entrer dans la base. Elle a donné son numéro de téléphone.
INSERT INTO professeur (nom, prenom, email, telephone)
VALUES ('Dubois', 'Sophie', 's.dubois@ecole.be', '0471 23 45 67');
L'instruction se lit presque comme une phrase. INSERT INTO veut dire insère dans, et VALUES veut dire les valeurs : « insère dans la table professeur, dans les colonnes nom, prenom, email et telephone, les valeurs 'Dubois', 'Sophie'… ».
📖 Nouvelle notion : INSERT
L'instruction
INSERT INTO table (colonnes) VALUES (valeurs)ajoute une ligne dans une table. Les valeurs sont données dans le même ordre que les colonnes : la première valeur va dans la première colonne citée, et ainsi de suite. Les textes s'écrivent entre apostrophes.En anglais : 🇬🇧 insert, insérer.
Vérifie tout de suite le résultat :
SELECT * FROM professeur;
id | nom | prenom | email | actif | telephone
---+--------+--------+-------------------+-------+--------------
1 | Dubois | Sophie | s.dubois@ecole.be | 1 | 0471 23 45 67
Deux colonnes sont remplies alors que l'INSERT ne les cite pas :
id vaut 1 : SQLite a choisi le numéro lui-même, grâce à INTEGER PRIMARY KEY ;actif vaut 1 : c'est la valeur prévue par DEFAULT 1.💡 Un
SELECTaprès chaque ajout. DB Browser annonce que l'instruction s'est bien exécutée, mais seul unSELECTmontre ce que la table contient vraiment. Prends l'habitude de vérifier à chaque fois.
Trois autres professeurs arrivent : Ludovic Lambrechts, Marc Vermeulen et Anne Leroy. Aucun n'a donné de téléphone. Plutôt que d'écrire trois INSERT, on sépare les groupes de valeurs par des virgules :
INSERT INTO professeur (nom, prenom, email)
VALUES
('Lambrechts', 'Ludovic', 'l.lambrechts@ecole.be'),
('Vermeulen', 'Marc', 'm.vermeulen@ecole.be'),
('Leroy', 'Anne', 'a.leroy@ecole.be');
Sous la zone de requête, DB Browser indique le nombre de lignes ajoutées : trois.
SELECT * FROM professeur;
id | nom | prenom | email | actif | telephone
---+------------+---------+-----------------------+-------+--------------
1 | Dubois | Sophie | s.dubois@ecole.be | 1 | 0471 23 45 67
2 | Lambrechts | Ludovic | l.lambrechts@ecole.be | 1 | NULL
3 | Vermeulen | Marc | m.vermeulen@ecole.be | 1 | NULL
4 | Leroy | Anne | a.leroy@ecole.be | 1 | NULL
Cette fois, telephone n'était pas citée et n'a pas de valeur par défaut : elle reçoit NULL, qui veut dire « aucune valeur ».
🧠 Une colonne que tu ne cites pas dans l'
INSERTreçoit sa valeur par défaut si elle en a une, sinonNULL. La clé primaireINTEGER PRIMARY KEY, elle, reçoit le numéro suivant.
On peut écrire un INSERT sans la liste des colonnes. Essaie :
INSERT INTO professeur VALUES ('Lemaire', 'Claire', 'c.lemaire@ecole.be');
table professeur has 6 columns but 3 values were supplied
Le message dit : « la table professeur a 6 colonnes, mais 3 valeurs ont été fournies ». Sans liste, SQLite exige une valeur pour chaque colonne, dans l'ordre exact de la table, id compris.
⚠️ L'
INSERTsans liste de colonnes est dangereux. Si tu inverses le nom et le prénom, SQLite ne voit rien : ce sont deux textes. Et le jour où quelqu'un ajoute une colonne à la table, tous tes anciensINSERTcessent de fonctionner. Avec la liste des colonnes, chaque valeur sait où elle va.
Les contraintes de la table ne sont pas décoratives. Provoque-les.
Claire Lemaire arrive, mais le prénom a été oublié dans l'instruction :
INSERT INTO professeur (nom, email)
VALUES ('Lemaire', 'c.lemaire@ecole.be');
NOT NULL constraint failed: professeur.prenom
Un nouveau professeur, Pierre Dubois, reçoit par erreur l'adresse de Sophie Dubois :
INSERT INTO professeur (nom, prenom, email)
VALUES ('Dubois', 'Pierre', 's.dubois@ecole.be');
UNIQUE constraint failed: professeur.email
SELECT * FROM professeur;
La table contient toujours les quatre mêmes professeurs. Une ligne refusée n'est pas ajoutée, même en partie.
Les messages sont en anglais, mais ils suivent toujours le même modèle : la contrainte, puis constraint failed (« contrainte non respectée »), puis la table et la colonne en cause.
| Message | Ce qu'il veut dire | Que faire |
|---|---|---|
NOT NULL constraint failed: professeur.prenom |
la colonne prenom est obligatoire et tu ne l'as pas remplie |
ajouter la valeur manquante |
UNIQUE constraint failed: professeur.email |
cette adresse existe déjà dans la table | vérifier la valeur, ou chercher la ligne existante |
table professeur has 6 columns but 3 values were supplied |
pas de liste de colonnes, et pas assez de valeurs | nommer les colonnes |
no such column: Lemaire |
un texte écrit sans apostrophes est pris pour un nom de colonne | entourer le texte d'apostrophes |
🧠 La base ne dit pas non par méchanceté. Chaque refus protège les données contre une erreur : un professeur sans prénom, deux comptes avec la même adresse. Le message indique précisément quelle règle a joué et sur quelle colonne. Lis-le avant de modifier ton instruction au hasard.
Le secrétariat envoie les deux derniers professeurs dans un fichier nouveaux-professeurs.csv. Ouvre-le avec le Bloc-notes :
nom;prenom;email
Martin;Julie;j.martin@ecole.be
Renard;Paul;p.renard@ecole.be
📖 Nouvelle notion : le fichier CSV
Un fichier CSV est un fichier texte qui contient un tableau : une ligne du fichier par ligne du tableau, avec les valeurs séparées par un caractère fixe (souvent la virgule ou le point-virgule). La première ligne donne souvent le nom des colonnes. Les tableurs et les bases de données savent tous le lire et l'écrire.
En anglais : 🇬🇧 Comma-Separated Values, des valeurs séparées par des virgules.
Ce fichier n'a pas les mêmes colonnes que la table : ni id, ni actif, ni telephone. On procède donc en deux temps : on importe le fichier dans une table de passage, puis on copie ses lignes dans professeur.
nouveaux-professeurs.csv.import_prof.; comme séparateur.nom, prenom, email et deux lignes. Valide.SELECT * FROM import_prof;
nom | prenom | email
-------+--------+------------------
Martin | Julie | j.martin@ecole.be
Renard | Paul | p.renard@ecole.be
Au lieu de VALUES, on donne à l'INSERT le résultat d'un SELECT :
INSERT INTO professeur (nom, prenom, email)
SELECT nom, prenom, email
FROM import_prof;
Cela se lit : « insère dans professeur, dans les colonnes nom, prenom, email, les lignes que renvoie ce SELECT ».
📖 Nouvelle notion : INSERT … SELECT
INSERT INTO table (colonnes) SELECT …ajoute dans une table toutes les lignes renvoyées par unSELECT. LeSELECTdoit renvoyer autant de colonnes que la liste en cite, dans le même ordre. C'est la façon de copier des lignes d'une table vers une autre.En anglais : 🇬🇧 insert select.
SELECT * FROM professeur;
id | nom | prenom | email | actif | telephone
---+------------+---------+-----------------------+-------+--------------
1 | Dubois | Sophie | s.dubois@ecole.be | 1 | 0471 23 45 67
2 | Lambrechts | Ludovic | l.lambrechts@ecole.be | 1 | NULL
3 | Vermeulen | Marc | m.vermeulen@ecole.be | 1 | NULL
4 | Leroy | Anne | a.leroy@ecole.be | 1 | NULL
5 | Martin | Julie | j.martin@ecole.be | 1 | NULL
6 | Renard | Paul | p.renard@ecole.be | 1 | NULL
Julie Martin et Paul Renard reçoivent les numéros 5 et 6, actif vaut 1, telephone vaut NULL.
⚠️ Et si tu exécutes l'
INSERT … SELECTune deuxième fois ? SQLite refuse avecUNIQUE constraint failed: professeur.email. La contrainteUNIQUEsur l'adresse te protège contre un double import.
La table import_prof a fait son travail. DROP TABLE veut dire laisse tomber la table : l'instruction la supprime avec son contenu.
DROP TABLE import_prof;
⚠️
DROP TABLEsupprime définitivement une table et toutes ses lignes. Ici, c'est voulu :import_profne servait que de passage. Vérifie toujours le nom de la table avant d'exécuter.
Tant que tu n'as rien enregistré, tes ajouts n'existent que dans DB Browser. Le fichier .db sur le disque n'a pas changé.
📖 Nouvelle notion : les modifications en attente
DB Browser garde tous tes changements en attente jusqu'à ce que tu cliques sur Écrire les modifications (
Ctrl+S). À ce moment, ils sont enregistrés dans le fichier de la base. Tant que ce n'est pas fait, le bouton Annuler les modifications remet la base dans l'état du dernier enregistrement.En anglais : 🇬🇧 Write Changes et 🇬🇧 Revert Changes.
Clique sur Écrire les modifications. Ta base contient maintenant les 12 élèves et les 6 professeurs.
Les exercices utilisent une table local. Crée-la d'abord avec ce script :
CREATE TABLE IF NOT EXISTS local (
id INTEGER PRIMARY KEY,
code TEXT NOT NULL UNIQUE,
etage INTEGER,
places INTEGER NOT NULL,
projecteur INTEGER NOT NULL DEFAULT 0
);
Sans exécuter, écris sur papier ce que contiendra la table local après ces trois instructions : les valeurs de id, etage et projecteur pour chaque ligne. Exécute ensuite, puis compare avec un SELECT.
INSERT INTO local (code, etage, places, projecteur) VALUES ('B14', 1, 24, 1);
INSERT INTO local (code, etage, places) VALUES ('B15', 1, 20), ('A02', 0, 30);
INSERT INTO local (code, places) VALUES ('C01', 16);
Chaque instruction est refusée. Exécute-la, recopie le message, explique l'erreur en une phrase, puis écris la version correcte.
-- a)
INSERT INTO local (code, etage, places) VALUES (B16, 1, 24);
-- b)
INSERT INTO local (code, etage, places) VALUES ('B16', 1);
-- c)
INSERT INTO locaux (code, etage, places) VALUES ('B16', 1, 24);
-- d)
INSERT INTO local (code, etage, places) VALUES ('B16', 1, 24),;
-- e)
INSERT INTO local VALUES ('B16', 1, 24, 0);
INSERT refusé par la contrainte NOT NULL de la table local. Recopie le message.INSERT refusé par la contrainte UNIQUE. Recopie le message.INSERT INTO local (code, etage, places) VALUES ('b14', 1, 24);. Pourquoi cette ligne est-elle acceptée alors que le local B14 existe ? Quel problème cela pose-t-il ?Une nouvelle professeure s'appelle Claire D'Hondt, adresse c.dhondt@ecole.be.
INSERT naturellement et exécute-le. Pourquoi SQLite est-il perdu ?'D''Hondt'. Corrige ton instruction, puis vérifie avec un SELECT que le nom est bien enregistré avec une seule apostrophe.nouveaux-eleves.csv qui contient la ligne d'en-tête nom;prenom;commune et deux élèves inventés.import_eleve.eleve avec un INSERT … SELECT.id, email et absences ? Pourquoi ?INSERT INTO table (colonnes) VALUES (valeurs) ajoute une ligne ; les textes s'écrivent entre apostrophes.DEFAULT, sinon NULL ; INTEGER PRIMARY KEY reçoit le numéro suivant.(…) séparés par des virgules après VALUES.table.colonne : lis-le avant de corriger. Une ligne refusée n'est pas ajoutée.INSERT … SELECT → DROP TABLE de la table de passage.La table est remplie, mais les données changent : un professeur quitte l'école, un élève a une absence de plus. L'article Modifier des lignes : UPDATE montre comment modifier une ligne sans toucher aux autres.