phpInfo.netLes ArchivesLes éléPHPants

  
  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  
Rappel

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.

L'insertion : INSERT

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.

  idx    nom  
  1    Avenir  


Le remplacement : REPLACE

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  


L'insertion multiple : INSERT ... SELECT

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  


La mise à jour : UPDATE

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  


La suppression : DELETE

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.

  projet    membre    remarque  
               

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  


Conclusion

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

Synseo