Tous les prix à zéro
INSERT, UPDATE et DELETE ajoutent, changent et suppriment des lignes d'une base de données, et une transaction permet de tout annuler en cas d'erreur.
Savoir s'en servir sans rien perdre évite qu'un oubli efface une table entière. Une épicière voulait baisser le prix du lait : elle a mis tous ses prix à zéro, parce qu'elle a oublié un petit mot.
À la fin de cette leçon
Remarque
Je peux modifier les données d'une table sans rien perdre.
Mots clés
| Mot | Ce que ça veut dire |
|---|---|
| INSERT | ajoute une ligne à une table |
| UPDATE | change les valeurs de lignes qui existent déjà |
| DELETE | supprime des lignes |
| Transaction | un groupe de changements qui réussit en entier ou pas du tout |
| COMMIT | garde pour toujours les changements d'une transaction |
| ROLLBACK | annule les changements d'une transaction |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Voir, changer, revoir : trois temps pour modifier
INSERT ajoute une ligne. UPDATE change des lignes qui existent. Les deux écrivent dans la table, et un oubli coûte cher.
Prends un réflexe en trois temps. Voir : écris d'abord un SELECT avec la même condition. Changer : remplace SELECT par UPDATE. Revoir : relis la table.
Avant de commencer
Remarque
Appuie sur Start the lab dans la barre en haut et attends que la machine soit prête. Les deux Runs suivants servent à te connecter. Le deuxième crée un alias : un nom court, sql, pour une longue commande.
Accepter le certificat du serveur
printf '[client]\nssl-verify-server-cert=0\n' > ~/.my.cnfAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Un nom court pour la boutique
alias sql='mariadb -h db -u student -pstudent shop -t -e'Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Créer la base de ton épicerie
sql "CREATE DATABASE IF NOT EXISTS student_epicerie"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Un nom court pour elle
alias epi='mariadb -h db -u student -pstudent student_epicerie -t -e'Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Créer la table et y ajouter cinq articles
epi "DROP TABLE IF EXISTS articles; CREATE TABLE articles (id INT AUTO_INCREMENT PRIMARY KEY, nom VARCHAR(30) NOT NULL, stock INT NOT NULL DEFAULT 0, prix DECIMAL(5,2) NOT NULL); INSERT INTO articles (nom, stock, prix) VALUES ('Pates', 12, 1.20), ('Riz', 3, 1.80), ('Lait', 0, 0.95), ('Cafe', 2, 4.50), ('Sucre', 0, 1.10)"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Temps 1 : voir les articles presque épuisés
epi "SELECT id, nom, stock FROM articles WHERE stock < 5 ORDER BY id"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Temps 2 : ajouter 20 au stock de ceux-là
epi "UPDATE articles SET stock = stock + 20 WHERE stock < 5"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Temps 3 : revoir toute la table
epi "SELECT id, nom, stock FROM articles ORDER BY id"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
DELETE supprime, et il ne demande rien
DELETE FROM articles WHERE ... supprime les lignes qui réussissent la condition. La base ne demande pas « êtes-vous sûr ? ».
Applique le même réflexe : écris le SELECT d'abord. Une clé étrangère aide aussi : la base refuse de supprimer un client qui a encore des commandes.
Exemple : le réflexe en trois temps
| Temps | Ce que tu écris | Ce que tu vérifies |
|---|---|---|
| Voir | SELECT id, nom FROM articles WHERE nom = 'Sucre' | Une seule ligne, la bonne |
| Changer | DELETE FROM articles WHERE nom = 'Sucre' | Même condition que le SELECT |
| Revoir | SELECT id, nom, prix FROM articles ORDER BY id | La ligne a disparu, les autres restent |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Temps 1 : voir la ligne à supprimer
epi "SELECT id, nom FROM articles WHERE nom = 'Sucre'"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Temps 2 et 3 : supprimer, puis revoir
epi "DELETE FROM articles WHERE nom = 'Sucre'; SELECT id, nom, prix FROM articles ORDER BY id"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une erreur fréquente
Attention
Beaucoup pensent qu'un UPDATE ou un DELETE touche seulement la ligne à laquelle ils pensent. Sans WHERE, il touche toutes les lignes. Écris le WHERE avant le reste, et relis-le avant d'appuyer sur Entrée.
Une transaction permet d'annuler
Une transaction regroupe des changements. START TRANSACTION l'ouvre. COMMIT garde tout pour toujours. ROLLBACK défait tout depuis l'ouverture.
Sans transaction, chaque commande est gardée tout de suite et ne se défait plus. Chaque Run ouvre une session neuve : les étapes d'une transaction se tapent dans un seul Run.
Le même oubli de WHERE, puis ROLLBACK
epi "START TRANSACTION; UPDATE articles SET prix = 0; SELECT nom, prix FROM articles ORDER BY id; ROLLBACK; SELECT nom, prix FROM articles ORDER BY id"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Un changement voulu, gardé avec COMMIT
epi "START TRANSACTION; UPDATE articles SET prix = 1.00 WHERE nom = 'Lait'; COMMIT; SELECT nom, prix FROM articles ORDER BY id"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
À toi : voir, changer, revoir
-- 1. Voir : quels articles sont presque épuisés ?
SELECT id, nom, stock FROM articles WHERE stock < 5;
-- 2. Changer : ajoute 10 au stock de ces articles seulement.
UPDATE articles SET stock = stock + 10 WHERE stock < 5;
-- 3. Revoir : le résultat est-il celui que tu attendais ?
SELECT id, nom, stock FROM articles ORDER BY id;