Module 3Manipuler les données
Chapitre 6 sur 9
Créer une base de données
Créer la base et ses tables avec leurs contraintes, puis insérer, modifier et supprimer des données.
- ≈ 150 min
- 6 leçons
- 4 vidéos
- 3 exercices
Module 3Manipuler les données
Chapitre 6 sur 9
Créer la base et ses tables avec leurs contraintes, puis insérer, modifier et supprimer des données.
Objectifs
Avec ce chapitre, tu sauras…
CREATE DATABASE, DROP DATABASE) ;PRIMARY KEY, FOREIGN KEY, NOT NULL, UNIQUE, DEFAULT, CHECK, AUTO_INCREMENT ;ALTER TABLE ;INSERT, UPDATE, DELETE) ;ON DELETE / ON UPDATE.Leçon 1
| Famille | Rôle | Commandes |
|---|---|---|
| LDD (langage de définition des données) | créer et modifier la structure | CREATE, ALTER, DROP, TRUNCATE |
| LMD (langage de manipulation des données) | lire et modifier les données | SELECT, INSERT, UPDATE, DELETE |
| LCD (langage de contrôle des données) | gérer les droits | GRANT, REVOKE (chapitre 8) |
| LCT (langage de contrôle des transactions) | valider ou annuler un ensemble d'opérations | START TRANSACTION, COMMIT, ROLLBACK (chapitre 8) |
Leçon 2
Leçon 3
| Contrainte | Rôle | Exemple |
|---|---|---|
PRIMARY KEY | clé primaire : unique et non vide | PRIMARY KEY (codeForm) |
FOREIGN KEY ... REFERENCES | clé étrangère : la valeur doit exister dans la table référencée | FOREIGN KEY (codeForm) REFERENCES FORMATION (codeForm) |
NOT NULL | valeur obligatoire | nomEtu VARCHAR(30) NOT NULL |
UNIQUE |
Leçon 4
Leçon 5
Vidéo · À regarder
ENPHP Full Course 2025 - Learn PHP from Scratch
Dani Krossing · YouTube
Leçon 6
| Option de la clé étrangère | Quand la ligne parent est supprimée (ou sa clé modifiée)… |
|---|---|
RESTRICT / NO ACTION (par défaut) | l'opération est refusée tant qu'il existe des lignes enfants |
CASCADE | les lignes enfants sont supprimées (ou mises à jour) aussi |
SET NULL | la clé étrangère des lignes enfants passe à NULL (la colonne doit l'accepter) |
1CREATE, ALTER, DROP appartiennent au…
2Une clé primaire est…
3Pour ajouter une colonne à une table existante :
4DELETE FROM ETUDIANT; sans WHERE…
5Insérer une inscription pour une session inexistante…
6Avec ON DELETE CASCADE, supprimer un étudiant…
7Une date s'écrit en SQL…
L'essentiel du chapitre
CREATE, ALTER, DROP, TRUNCATE), LMD (SELECT, INSERT, UPDATE, DELETE), LCD (GRANT, REVOKE), LCT (COMMIT, ROLLBACK).CREATE DATABASE nom CHARACTER SET utf8mb4; puis USE nom;.CREATE TABLE avec types et contraintes : PRIMARY KEY, FOREIGN KEY ... REFERENCES, NOT NULL, UNIQUE, DEFAULT, CHECK, AUTO_INCREMENT ; créer les tables parents d'abord.ALTER TABLE ... ADD / MODIFY / RENAME COLUMN / DROP COLUMN.INSERT INTO t (cols) VALUES (...), (...); ; UPDATE t SET ... WHERE ...; ; DELETE FROM t WHERE ...; : jamais sans WHERE par erreur.RESTRICT, CASCADE, SET NULL.| pas de doublon (mais la valeur peut être NULL) |
email VARCHAR(100) UNIQUE |
DEFAULT | valeur par défaut si rien n'est fourni | typeCours ... DEFAULT 'presentiel' |
CHECK | condition que la valeur doit respecter (MySQL 8.0.16 et plus) | CHECK (prixForm > 0) |
AUTO_INCREMENT | numéro généré automatiquement (1, 2, 3…) | id INT AUTO_INCREMENT PRIMARY KEY |
Vidéo · À regarder
ENMySQL Database - Full Course
freeCodeCamp.org · YouTube
Vidéo · À regarder
ENPHP Full Course 2025 - Learn PHP from Scratch
Dani Krossing · YouTube
Vidéo · À regarder
ENMySQL Database - Full Course
freeCodeCamp.org · YouTube
SELECT, FROM), même si MySQL les accepte en minuscules ;'Tanger', '2026-03-02' (format AAAA-MM-JJ) ;-- (deux tirets et une espace) ou s'écrit entre /* */ ;;.CREATE DATABASE centre_formation
CHARACTER SET utf8mb4
COLLATE utf8mb4_0900_ai_ci;
USE centre_formation; -- toutes les commandes suivantes s'appliquent à cette base
-- DROP DATABASE centre_formation; -- supprime la base ET toutes ses données : irréversible !CREATE DATABASE IF NOT EXISTS centre_formation; ne provoque pas d'erreur si la base existe déjà, et DROP TABLE IF EXISTS INSCRIPTION; ne provoque pas d'erreur si la table n'existe pas. On les utilise dans les scripts qu'on exécute plusieurs fois.
Tableau: Les contraintes
ALTER TABLE ETUDIANT ADD emailEtu VARCHAR(100) UNIQUE; -- ajouter une colonne
ALTER TABLE ETUDIANT MODIFY adresseEtu VARCHAR(150); -- changer le type ou la taille
ALTER TABLE ETUDIANT RENAME COLUMN niveauEtu TO niveauScolaire; -- renommer une colonne
ALTER TABLE ETUDIANT DROP COLUMN emailEtu; -- supprimer une colonne
ALTER TABLE FORMATION ADD CONSTRAINT chk_duree CHECK (dureeForm <= 365); -- ajouter une contrainte
RENAME TABLE COMBINAISON TO APPARTIENT; -- renommer une table
DROP TABLE IF EXISTS APPARTIENT; -- supprimer une table
TRUNCATE TABLE INSCRIPTION; -- vider une table (garder sa structure)INSERT
INSERT INTO FORMATION (codeForm, titreForm, dureeForm, prixForm) VALUES
('BD001', 'Base de données', 30, 2500),
('ID01', 'Introduction au développement', 90, 2500),
('CCP01', 'C/C++', 30, 3000),
('WEB01', 'Développement web', 60, 4000),
('PY01', 'Python', 45, 3500);
INSERT INTO SPECIALITE (codeSpec, nomSpec) VALUES
('DEV', 'Développement'), ('DATA', 'Data'), ('RES', 'Réseaux');
INSERT INTO COMBINAISON (codeSpec, codeForm) VALUES
('DEV', 'ID01'), ('DEV', 'CCP01'), ('DEV', 'WEB01'), ('DEV', 'PY01'),
('DATA', 'BD001'), ('DATA', 'PY01'), ('RES', 'CCP01');
INSERT INTO SESSION VALUES
('S01', 'BD printemps', '2026-03-02', '2026-04-01', 'BD001'),
('S02', 'BD automne', '2026-10-05', '2026-11-04', 'BD001'),
('S03', 'Dev intro', '2026-01-12', '2026-04-12', 'ID01'),
('S04', 'C avancé', '2026-05-04', '2026-06-03', 'CCP01'),
('S05', 'Web été', '2026-06-01', '2026-07-31', 'WEB01');
INSERT INTO ETUDIANT (numCINEtu, nomEtu, prenomEtu, dateNaissEtu, niveauEtu, nomVilleEtu) VALUES
('G683909', 'Alaoui', 'Mohammed', '2002-05-14', 'Bac', 'Tanger'),
('AB123456', 'Hilali', 'Nour', '2004-11-02', 'Bac+2', 'Rabat'),
('BE998877', 'Benali', 'Sara', '2003-07-21', 'Bac', 'Casablanca'),
('CD445566', 'Tazi', 'Youssef', '2001-01-30', 'Bac+3', 'Casablanca'),
('EE112233', 'Filali', 'Hassan', '2005-09-09', 'Bac', 'Fès'),
('FF778899', 'Saidi', 'Imane', '2003-03-15', 'Bac+2', 'Rabat');
INSERT INTO INSCRIPTION (numCINEtu, codeSess, typeCours) VALUES
('G683909', 'S01', 'presentiel'), ('G683909', 'S04', 'distanciel'),
('AB123456', 'S01', 'distanciel'), ('AB123456', 'S05', 'presentiel'),
('BE998877', 'S03', 'presentiel'), ('BE998877', 'S05', 'distanciel'),
('CD445566', 'S01', 'presentiel'), ('EE112233', 'S05', 'presentiel');INSERT INTO SESSION VALUES (...) sans liste de colonnes fonctionne, mais il faut fournir toutes les valeurs dans l'ordre exact des colonnes ; si quelqu'un ajoute une colonne à la table, l'insertion échoue. Écris de préférence INSERT INTO table (col1, col2) VALUES (...). Les colonnes non citées prennent leur valeur par défaut (ou NULL).
UPDATE et DELETE
UPDATE FORMATION SET prixForm = 2700 WHERE codeForm = 'BD001'; -- une formation
UPDATE FORMATION SET prixForm = prixForm * 1.05; -- toutes : +5 %
UPDATE ETUDIANT SET niveauEtu = 'Bac+2', nomVilleEtu = 'Tétouan' WHERE numCINEtu = 'G683909';
DELETE FROM INSCRIPTION WHERE numCINEtu = 'EE112233' AND codeSess = 'S05';UPDATE FORMATION SET prixForm = 0; ou DELETE FROM ETUDIANT; sans WHERE modifient ou suppriment toutes les lignes de la table. Écris toujours le WHERE en premier, et teste-le avec un SELECT ... WHERE ... identique avant d'exécuter. MySQL Workbench bloque d'ailleurs par défaut ces requêtes (option Safe Updates).
Insérer et supprimer des données (en anglais).
L'intégrité référentielle garantit que chaque clé étrangère correspond à une clé primaire existante. MySQL (moteur InnoDB, celui par défaut) refuse :
INSERT INTO INSCRIPTION VALUES ('ZZ000000', 'S01', 'presentiel');
-- ERROR 1452: Cannot add or update a child row: a foreign key constraint fails
DELETE FROM ETUDIANT WHERE numCINEtu = 'G683909';
-- ERROR 1451: Cannot delete or update a parent row: a foreign key constraint failsFOREIGN KEY (numCINEtu) REFERENCES ETUDIANT (numCINEtu)
ON DELETE CASCADE
ON UPDATE CASCADEÀ partir de ton MLD (TP 3.4), écris le script bibliotheque.sql qui crée toutes les tables avec leurs types et leurs contraintes (clés, NOT NULL, UNIQUE pour l'e-mail, CHECK pour l'année de parution et les dates de prêt, DEFAULT pour l'état d'un exemplaire). Insère au moins 3 genres, 5 auteurs, 8 livres, 12 exemplaires, 5 adhérents et 10 prêts, puis vérifie qu'une insertion invalide est bien refusée.
Ce script contient cinq erreurs. Trouve-les et corrige-les.
CREATE TABLE INSCRIPTION (
numCINEtu CHAR(9) NOT NULL,
codeSess VARCHAR(9) NOT NULL,
PRIMARY KEY (numCINEtu),
FOREIGN KEY (codeSess) REFERENCES SESSION
);
CREATE TABLE SESSION (codeSess VARCHAR(9) PRIMARY KEY, nomSess VARCHAR(30));
INSERT INTO ETUDIANT (numCINEtu, nomEtu) VALUES (G683909, 'Alaoui');
UPDATE FORMATION SET prixForm = 3000;Écris les requêtes pour : (1) ajouter la formation « Réseaux » (code RES01, 40 jours, 2800 DH) ; (2) l'associer à la spécialité RES ; (3) créer pour elle la session S06 « Réseaux hiver » du 4 janvier au 12 février 2027 ; (4) inscrire Imane Saidi à S06 à distance ; (5) augmenter de 10 % le prix des formations de plus de 50 jours ; (6) ajouter à ETUDIANT une colonne telEtu de 10 caractères.
Le script du centre de formation
Voici la traduction exacte du MLD du chapitre 3. L'ordre compte : une table doit exister avant qu'une autre la référence.
CREATE TABLE FORMATION (
codeForm VARCHAR(9) NOT NULL,
titreForm VARCHAR(30) NOT NULL,
dureeForm SMALLINT NOT NULL,
prixForm DECIMAL(8,2) NOT NULL,
PRIMARY KEY (codeForm),
CHECK (dureeForm > 0),
CHECK (prixForm > 0)
);
CREATE TABLE SPECIALITE (
codeSpec VARCHAR(10) NOT NULL,
nomSpec VARCHAR(30) NOT NULL,
descSpec VARCHAR(90),
PRIMARY KEY (codeSpec)
);
CREATE TABLE ETUDIANT (
numCINEtu CHAR(9) NOT NULL,
nomEtu VARCHAR(30) NOT NULL,
prenomEtu VARCHAR(30) NOT NULL,
dateNaissEtu DATE NOT NULL,
niveauEtu VARCHAR(15),
nomVilleEtu VARCHAR(15) NOT NULL,
adresseEtu VARCHAR(90),
PRIMARY KEY (numCINEtu)
);
CREATE TABLE SESSION (
codeSess VARCHAR(9) NOT NULL,
nomSess VARCHAR(30) NOT NULL,
dateDebutSess DATE NOT NULL,
dateFinSess DATE NOT NULL,
codeForm VARCHAR(9) NOT NULL,
PRIMARY KEY (codeSess),
FOREIGN KEY (codeForm) REFERENCES FORMATION (codeForm),
CHECK (dateFinSess > dateDebutSess)
);
CREATE TABLE INSCRIPTION (
numCINEtu CHAR(9) NOT NULL,
codeSess VARCHAR(9) NOT NULL,
typeCours ENUM('presentiel', 'distanciel') NOT NULL DEFAULT 'presentiel',
PRIMARY KEY (numCINEtu, codeSess), -- clé primaire composée
FOREIGN KEY (numCINEtu) REFERENCES ETUDIANT (numCINEtu),
FOREIGN KEY (codeSess) REFERENCES SESSION (codeSess)
);
CREATE TABLE COMBINAISON (
codeSpec VARCHAR(10) NOT NULL,
codeForm VARCHAR(9) NOT NULL,
PRIMARY KEY (codeSpec, codeForm),
FOREIGN KEY (codeSpec) REFERENCES SPECIALITE (codeSpec),
FOREIGN KEY (codeForm) REFERENCES FORMATION (codeForm)
);SHOW TABLES;
DESCRIBE ETUDIANT; -- les colonnes, leurs types, les clés
SHOW CREATE TABLE INSCRIPTION; -- le script complet de la tableSESSION est un mot-clé de MySQL (on écrit SET SESSION ...), mais il n'est pas réservé : la table peut porter ce nom. Pour éviter tout doute, on peut entourer un nom de table ou de colonne d'accents graves : `SESSION`. Ces accents graves sont aussi obligatoires pour un nom qui contient une espace ou un tiret.
Créer une table en SQL (en anglais).
Créer les tables d'une base de données, colonne par colonne (en anglais).
Insérer, modifier et supprimer des données (en anglais).
CASCADE est logique pour une table d'association (supprimer un étudiant supprime ses inscriptions). Pour une donnée importante (supprimer une formation qui a des sessions), on garde RESTRICT : l'utilisateur doit d'abord traiter les sessions. Une erreur de cascade peut effacer des milliers de lignes.