Toutes les commandes annulées
Un développeur voulait annuler une seule commande. Il a oublié un petit mot à la fin de sa requête.
Les deux mille commandes de la base sont passées à « annulée », et le service client a téléphoné toute la matinée.
Modifier des données est facile. Ne modifier que les bonnes lignes est le vrai savoir-faire.
À la fin de cette leçon
Remarque
Je peux ajouter, modifier et supprimer des lignes sans risque.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| INSERT | ajoute de nouvelles lignes à une table | |
| UPDATE | change des valeurs dans des lignes qui existent | |
| DELETE | retire des lignes d'une table | |
| Transaction | un groupe de changements qui ont tous lieu ou aucun | |
| Validation | rend définitifs les changements d'une transaction | COMMIT |
| Annulation | défait les changements d'une transaction | ROLLBACK |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Travaillez sur une copie, jamais sur la boutique
Vous allez changer des données. La boutique doit rester intacte : faites d'abord une copie.
Ces Runs créent votre base student_copie, puis une table papeterie où vous recopiez les quatre articles de papeterie.
Relancez-les à tout moment pour repartir de zéro.
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 le client
alias bd='mariadb -h db -u student -pstudent -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 votre base
bd "CREATE DATABASE IF NOT EXISTS student_copie"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.
Jeter une ancienne copie
bd "DROP TABLE IF EXISTS student_copie.papeterie"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 de la copie
bd "CREATE TABLE student_copie.papeterie (id INT PRIMARY KEY, nom VARCHAR(100) NOT NULL, prix DECIMAL(8,2) NOT NULL, stock INT NOT NULL)"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.
Recopier les articles de papeterie
bd "INSERT INTO student_copie.papeterie SELECT id, name, price, stock FROM shop.products WHERE category_id = 7"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.
INSERT ajoute une ligne
INSERT INTO nomme la table et ses colonnes. VALUES donne une parenthèse de valeurs pour chaque nouvelle ligne.
Donnez les valeurs dans l'ordre des colonnes. Une colonne omise prend sa valeur par défaut, ou NULL.
Si une règle de clé est violée, la base refuse la ligne, comme dans la première leçon.
Ajouter un stylo à bille
bd "INSERT INTO student_copie.papeterie (id, nom, prix, stock) VALUES (200, 'Stylo bille', 1.80, 150)"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.
UPDATE change des lignes, WHERE choisit lesquelles
UPDATE nomme la table. SET donne la nouvelle valeur. WHERE choisit les lignes.
Sans WHERE, toutes les lignes changent.
Le bon réflexe a trois temps. Écrivez un SELECT avec le même WHERE. Vérifiez qu'il montre les lignes voulues. Puis changez SELECT en UPDATE.
Temps 1 : regarder les lignes d'abord
bd "SELECT id, nom, prix FROM student_copie.papeterie WHERE prix < 10 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 : changer exactement celles-là
bd "UPDATE student_copie.papeterie SET prix = ROUND(prix * 1.1, 2) WHERE prix < 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 3 : regarder de nouveau
bd "SELECT id, nom, prix, stock FROM student_copie.papeterie 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.
À vous : le SELECT avant l'UPDATE
-- Avant un UPDATE, écrivez le SELECT qui a la même condition.
-- Quelles pièces passeraient à « a_commander » si le stock est sous 3 ?
SELECT id, nom, stock FROM pieces
WHERE stock < 3 AND statut = 'ok'
ORDER BY id;
-- Changez le seuil 3 en 5 : combien de lignes de plus ?
DELETE retire des lignes, pour de bon
DELETE FROM retire les lignes qui correspondent à son WHERE. Sans WHERE, il vide toute la table.
Il n'y a pas de corbeille. Les trois temps s'appliquent : SELECT d'abord, puis DELETE, puis SELECT de nouveau.
Le dernier Run montrait déjà la colonne stock : un seul article est à 0. C'est le premier temps.
Retirer les articles épuisés de la copie
bd "DELETE FROM student_copie.papeterie WHERE stock = 0"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 qu'ils ont en tête. Il touche toutes les lignes qui correspondent, et sans WHERE ce sont toutes. Écrivez le WHERE d'abord et vérifiez-le avec un SELECT.
L'erreur, sur la copie seulement
bd "UPDATE student_copie.papeterie SET stock = 0"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.
Voir ce qu'elle a fait
bd "SELECT id, nom, stock FROM student_copie.papeterie 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 transaction, c'est tout ou rien
Virer 50 € d'un compte à un autre fait deux changements. Si la machine tombe entre les deux, 50 € ont disparu.
Une transaction groupe les changements. COMMIT les rend tous définitifs. ROLLBACK les défait tous.
Tant que vous n'avez pas validé, personne d'autre ne voit les changements.
Le Run suivant envoie quatre instructions dans une même session. Il vide la copie dans une transaction, l'annule, puis compte les lignes.
Tout vider, puis tout annuler
bd "START TRANSACTION; DELETE FROM student_copie.papeterie; ROLLBACK; SELECT COUNT(*) AS toujours_la FROM student_copie.papeterie"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.
Exemple : une panne à mi-chemin
| Étape | Compte 1 | Compte 2 | Sans transaction | Avec transaction |
|---|---|---|---|---|
| Départ | 200 € | 100 € | Correct | Correct |
| Après le premier changement | 150 € | 100 € | 50 € manquent | Pas encore définitif |
| Panne | 150 € | 100 € | Reste faux | Retour à 200 € et 100 € |
| Deux changements et COMMIT | 150 € | 150 € | Correct | Correct |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Voir le mode par défaut
bd "SELECT @@autocommit AS autocommit"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.