MySQL
Mise à jour de données dans une table
Voici le chapitre Mise à jour de données dans une table — c’est ici que les choses deviennent délicates, parce que modifier de la donnée est plus risqué qu’en insérer. On va donc faire ça proprement.
🔧 Mise à jour de données dans une table
(UPDATE — WHERE, SET, multiples colonnes, jointures, conditions, sécurité, timestamps)
La commande centrale est :
UPDATE NomTable
SET Colonne = Valeur
WHERE Condition;
Le WHERE est vital. Sans lui, tu mets à jour toutes les lignes de la table (ce qui arrive plus souvent qu’on ne l’admet…).
On voit toutes les variantes utiles.
⸻
🟩 1. Mettre à jour une seule colonne
Exemple simple :
UPDATE User
SET Nom = 'Alexandre'
WHERE UserID = 12;
La condition cible 1 seule ligne, ce qui est ce qu’on veut dans 99 % des cas.
🟦 2. Mettre à jour plusieurs colonnes à la fois
UPDATE User
SET Nom = 'Alexandre',
Email = 'alex@example.com'
WHERE UserID = 12;
Pratique quand tu fais une édition de profil par exemple.
🟧 3. Mise à jour basée sur une condition (WHERE avancé)
Par exemple, mettre un nouveau domaine email pour tous les utilisateurs qui ont l’ancien :
UPDATE User
SET Email = REPLACE(Email, '@old.com', '@new.com')
WHERE Email LIKE '%@old.com';
Autre cas : désactiver tous les comptes inactifs depuis plus d’un an.
UPDATE User
SET Actif = 0
WHERE LastLogin < '2024-01-01';
🟥 4. Mise à jour de masse volontaire (pas de WHERE)
À utiliser avec précaution.
Exemple : réinitialiser tout le monde :
UPDATE User
SET Actif = 1;
Utile seulement lors de migrations ou nettoyages.
🟪 5. Mise à jour avec une valeur dynamique (NOW(), CURRENT_TIMESTAMP)
Exemple : enregistrer la dernière connexion de l’utilisateur :
UPDATE User
SET LastLogin = NOW()
WHERE UserID = 12;
Même chose lors d’une modification :
UPDATE Video
SET UpdateDate = CURRENT_TIMESTAMP
WHERE VideoID = 7;
🟫 6. Mise à jour liée à une autre table (UPDATE avec JOIN)
Cas classique dans SAMI :
mettre à jour une table pivot ou synchroniser un champ.
Exemple : changer le UserID d’une vidéo via l’email du propriétaire :
UPDATE Video v
JOIN User u ON v.UserID = u.UserID
SET v.UserID = 12
WHERE u.Email = 'ancien@mail.com';
Autre exemple : mettre tous les genres d’une vidéo à un certain statut :
UPDATE VideoGenre vg
JOIN Genre g ON vg.GenreID = g.GenreID
SET g.Visible = 0
WHERE vg.VideoID = 7;
Ces requêtes sont très puissantes et très dangereuses si mal utilisées.
🟨 7. Mise à jour conditionnelle avec logique (IF)
UPDATE User
SET TentativeLogin = IF(TentativeLogin >= 3, 0, TentativeLogin + 1)
WHERE UserID = 12;
Utile pour la gestion des tentatives de login comme dans ton système SAMI.
🔐 8. Mise à jour sécurisée (limiter le nombre de lignes)
Tu peux limiter la requête pour éviter les catastrophes :
UPDATE User
SET Actif = 0
WHERE GradeID = 3
LIMIT 50;
MySQL ne modifiera que 50 lignes max, même si la condition en matchait plus.
🧲 9. Mise à jour avec sous-requête (subquery)
Exemple : mettre le UserID d’une vidéo sur celui avec l’email “admin@sami.fr” :
UPDATE Video
SET UserID = (SELECT UserID FROM User WHERE Email = 'admin@sami.fr')
WHERE VideoID = 5;
Très pratique pour nettoyer la BDD.
🔎 10. Vérifier les changements
Avant mise à jour :
SELECT * FROM User WHERE UserID = 12;
Après :
SELECT * FROM User WHERE UserID = 12;
Toujours s’assurer que la modification est cohérente.
🧨 11. Les erreurs fréquentes (et comment les éviter)
Voici les pièges les plus classiques :
Oublier le WHERE
→ met à jour TOUS les enregistrements
Toujours vérifier deux fois.
Mettre une condition trop large
WHERE Email LIKE '%gmail%'
Ça peut toucher 2000 lignes au lieu d’une.
• Modifier une clé étrangère sans vérifier la contrainte
→ entraîne des erreurs :
Cannot delete or update a parent row...
Il faut parfois désactiver temporairement les contraintes (mais pas conseillé).
🎯 Conclusion
Avec ça tu maîtrises :
- mise à jour simple
- mise à jour multiple
- logique conditionnelle
- JOIN pour mise à jour complexe
- protection contre mise à jour massive involontaire
- mises à jour avec dates automatiques
C’est un chapitre critique pour gérer sérieusement une base MySQL.