Accueil
Trucs & Astuces
Scripts
Regex
Annuaire
Articles
.
|
Articles MySQL par l'exemple - Insertion, suppression et mise à jour Par Frédéric BOUCHERY
Février 2001
Si vous avez lu l'article précédent sur l'instruction SELECT, vous savez donc ce qu'est une table, et vous savez comment en extraire les informations dont vous avez besoin. Mais une table sans données ne sert à rien, c'est pourquoi dans cet article nous allons aborder l'insertion de données, la suppression et la mise à jour.
Pour nos exemples, nous utiliserons les 4 tables (vides) suivantes :
La table 'membres' :
idx | nom | prenom | [Numérique] (Auto-incrémenté) | [Chaîne] | [Chaîne] |
La table 'projets' :
idx | nom | [Numérique] (Auto-incrémenté) | [Chaîne] |
La table 'participants' (le couple projet-membre est déclaré unique) :
projet | membre | remarque | [Numérique] | [Numérique] | [chaîne] |
La table 'messages' (cette table a été mal créée, mais ce n'est pas important):
date | priorite | nom | message | [Date/Heure] | [Numérique] | [Chaîne] | [Chaîne] |
Les exemples évoluent au fur et à mesure des requêtes.
Exemple 1 : INSERT INTO messages VALUES('2001-12-17 20:07:52','1','fred','C\'est mon premier message')
Cette commande ajoute un enregistrement dans la table 'messages'. Vous noterez que l'on a ajouté un anti-slash '\' dans le dernier champ pour indiquer à MySQL de ne pas prendre en compte la guillemet après le 'C' comme une fin de chaîne. Notez également que cet anti-slash ne figure pas au final dans la table. Dans cet exemple, nous partons du principe que les valeurs données respectent scrupuleusement en ordre et en nombre la structure de la table, le premier champ est bien une date, et le dernier le message sous forme d'une chaîne.
date | priorite | nom | message | 2001-12-17 20:07:52 | 1 | fred | C'est mon premier message |
Exemple 2 : INSERT INTO messages VALUES('1','fred','2001-12-17 20:07:52','deuxième message')
Ici, nous avons fait une erreur, car nous n'avons pas respecté l'ordre des champs, ce qui ne donne pas le résultat attendu pour le deuxième enregistrement.
date | priorite | nom | message | 2001-12-17 20:07:52 | 1 | fred | C'est mon premier message | 0000-00-00 00:00:00 | 0 | 2001-12-17 20:07:52 | deuxième message |
Exemple 3 : INSERT INTO messages VALUES('Troisième message')
Cette commande ne marche pas, et MySQL retourne une erreur ('Column count doesn't match value count at row 1') car le nombre de valeurs que l'on veut insérer ne correspond pas au nombre de champs de la table. Il n'y a donc pas eu d'insertion.
date | priorite | nom | message | 2001-12-17 20:07:52 | 1 | fred | C'est mon premier message | 0000-00-00 00:00:00 | 0 | 2001-12-17 20:07:52 | deuxième message |
Exemple 4 : INSERT INTO messages (nom,message,date) VALUES ('Ingride','Message 4',NOW())
Cette fois-ci, il n'y a pas d'erreur, car nous précisons avant de donner les valeurs, le nom des champs à utiliser, ainsi que l'ordre. Vous remarquez que nous avons omis le champ 'priorite' et qu'il a donc pris sa valeur par défaut, qui est dans notre cas : '0'. Notez également que la date est renseignée en faisant appel à une fonction de MySQL : NOW() qui a pour résultat de donner la date courante du serveur.
Remarque : Il est vraiment intéressant de préciser les noms et l'ordre des champs dans une insertion, car si par la suite vous ajoutez un champ supplémentaire, vos anciennes requêtes fonctionneront toujours et utiliseront les valeurs par défaut de votre nouveau champ.
date | priorite | nom | message | 2001-12-17 20:07:52 | 1 | fred | C'est mon premier message | 0000-00-00 00:00:00 | 0 | 2001-12-17 20:07:52 | deuxième message | 2001-12-17 20:27:17 | 0 | Ingride | Message 4 |
Exemple 5 : INSERT INTO membres (prenom,nom) VALUES('Ingride','Ibeule')
Cette commande ajoute un enregistrement dans la table 'membres'. Encore une fois, nous ne donnons pas tous les champs, qui sont donc remplis avec les valeurs par défaut. Or, la valeur par défaut du champ manquant 'idx' n'est pas '0', mais '1' car ce champ est un champ auto-incrémenté. La valeur par défaut est donc MAX(idx)+1.
idx | nom | prenom | 1 | Ibeule | Ingride |
Exemple 6 : INSERT membres (idx,prenom,nom) VALUES(5,'Agathe','Zeublouse')
Cette fois ci, le champ 'idx' est fixé à '5', malgré que ce champ soit auto-incrémenté. Si le membre '5' existe déjà, on obtiendra l'erreur : "Duplicata du champ '5' pour la clef 1 ". Comme vous pouvez le remarquer, la directive INTO n'est pas présente, en fait, elle n'a jamais été obligatoire, mais elle l'est pour d'autres bases de données SQL !
idx | nom | prenom | 1 | Ibeule | Ingride | 5 | Zeublouse | Agathe |
Exemple 7 : INSERT projets SET idx = '1' , nom = 'Avenir'
Ici, nous introduisons une nouvelle forme de requête d'insertion avec la directive SET où il faut préciser le nom du champ suivit d'un signe '=' (égal) et de la valeur du champ. Tous les couples nom/valeur sont séparés par une virgule.
Exemple 8 : REPLACE INTO participants (membre,projet,remarque) VALUES(5,1,'Remarque 1')
La commande REPLACE est identique à la commande INSERT !. Vous me direz "Alors, à quoi ça sert ?". Voyons l'exemple suivant.
projet | membre | Remarque | 1 | 5 | remarque 1 |
Exemple 9 : REPLACE participants SET projet = 1, membre = 5, remarque = 'Nouvelle remarque'
Si j'avais utilisé une commande INSERT, MySQL m'aurait retourné une erreur car le couple projet/membre est unique, et ce couple existe déjà ! La commande REPLACE remplace donc cet enregistrement. Il n'y a rien de plus à dire sur cette commande qui se comporte comme la commande INSERT.
projet | membre | remarque | 1 | 5 | Nouvelle remarque |
Exemple 10 : INSERT messages (date,nom,message) SELECT NOW(),'MySQL',CONCAT('membre ',idx,' : ',prenom,' ',nom) FROM membres
Voici une requête intéressante qui permet d'insérer des données en provenance d'autres tables. Pour mener à bien la chose, il suffit de remplacer la partie VALUE(...) par une commande SELECT ... en respectant l'ordre et le nombre de champs à retourner.
date | priorite | nom | message | 2001-12-17 20:07:52 | 1 | fred | C'est mon premier message | 0000-00-00 00:00:00 | 0 | 2001-12-17 20:07:52 | deuxième message | 2001-12-17 20:27:17 | 0 | Ingride | Message 4 | 2001-12-17 20:13:07 | 0 | MySQL | membre 1 : Ingrid Ibeule | 2001-12-17 20:13:07 | 0 | MySQL | membre 5 : Agathe Zeublouse |
Exemple 11 : UPDATE messages SET priorite = priorite + 1 WHERE nom LIKE '%MySQL%'
Cette commande met à jour les enregistrements dont les nom contient 'MySQL', en incrémentant le champ 'priotite'.
date | priorite | nom | message | 2001-12-17 20:07:52 | 1 | fred | C'est mon premier message | 0000-00-00 00:00:00 | 0 | 2001-12-17 20:07:52 | deuxième message | 2001-12-17 20:27:17 | 0 | Ingride | Message 4 | 2001-12-17 20:13:07 | 1 | MySQL | membre 1 : Ingrid Ibeule | 2001-12-17 20:13:07 | 1 | MySQL | membre 5 : Agathe Zeublouse |
Exemple 12 : UPDATE messages SET priorite = 3, priorite = priorite + 5
Dans une requête UPDATE, les mises à jour sont exécutées de gauche à droite. Cette commande met donc le champ 'priorite' de tous les enregistrement (pas de clause WHERE) à 3, puis le champ 'priorite' est incrémenté de '5'. Tous les enregistrements ont donc le champ 'priorite' à '8'.
date | priorite | nom | message | 2001-12-17 20:07:52 | 8 | fred | C'est mon premier message | 0000-00-00 00:00:00 | 8 | 2001-12-17 20:07:52 | deuxième message | 2001-12-17 20:27:17 | 8 | Ingride | Message 4 | 2001-12-17 20:13:07 | 8 | MySQL | membre 1 : Ingrid Ibeule | 2001-12-17 20:13:07 | 8 | MySQL | membre 5 : Agathe Zeublouse |
Exemple 13 : DELETE FROM participants
Nous attaquons ici des requêtes "dangereuses" car nous supprimons des données dans les tables. Il faut donc faire très attention à ce que l'on fait !. Ici, nous supprimons TOUS les enregistrements de la table 'participants' sans distinction. En fait, dans ce cas précis, MySQL supprime le fichier qui correspond à cette table et la recrée, ce qui est beaucoup plus rapide que d'effacer élément par élément. Mais en contre partie, vous ne pouvez pas connaître le nombre d'éléments supprimés.
Exemple 14 : DELETE FROM messages WHERE date = 0
Cette requête ne supprime que les enregistrements où (WHERE dans la langue de Shakespeare) la valeur du champ date est à '0'. C'est déjà mieux que de tout supprimer.
Remarque : Lorsque l'on supprime un enregistrement au"milieu" d'une table, celui-ci laisse une place. Lors de l'insertion suivante, la donnée se placera dans ce "trou". Donc si vous parcourez cette table sans ordonner (ORDER BY), ne vous étonnez pas si vous retrouvez un enregistrement récent avant un enregistrement ancien.
date | priorite | nom | message | 2001-12-17 20:07:52 | 8 | fred | C'est mon premier message | 2001-12-17 20:27:17 | 8 | Ingride | Message 4 | 2001-12-17 20:13:07 | 8 | MySQL | membre 1 : Ingrid Ibeule | 2001-12-17 20:13:07 | 8 | MySQL | membre 5 : Agathe Zeublouse |
Exemple 15 : DELETE FROM messages LIMIT 2
Cette requête supprime les messages en se limitant aux 2 premiers enregistrements. ATTENTION : Avec phpMyAdmin, la clause LIMIT est supprimée, et vous risquez d'avoir de très mauvaise surprise !
date | priorite | nom | message | 2001-12-17 20:13:07 | 8 | MySQL | membre 1 : Ingrid Ibeule | 2001-12-17 20:13:07 | 8 | MySQL | membre 5 : Agathe Zeublouse |
Il existe parfois quelques subtilités en fonction de la version de MySQL, je vous invite donc à consulter la documentation MySQL sur les commandes :
» [Français - English] INSERT » [Français - English] REPLACE » [Français - English] UPDATE » [Français - English] DELETE
|
|