Mysql5 – Requêtes multiples

Si vous voulez parcourir toutes les améliorations de MySql5, lisez les official relase notes.

L’objectif de ce post est d’écrire des requêtes MySql plus efficaces. Certains serveurs surveillent les ressources MySql qu’occupent une page Web. Si le nombre de requêtes pour une simple page Web est considéré comme trop gourmand en ressources, le développeur pourrait bien recevoir un avertissement (voire plus) de la part de l’hébergeur.

Lisez l’article « PHP5 : Afficher toutes les requêtes MySql d’une page Web » pour surveiller vos requêtes.

Ce sur quoi je veux me concentrer ici est une syntaxe qui a été introduite dans MySql 4.1 mais qui me semble trop peu utilisée :

INSERT INTO… ON DUPLICATE KEY UPDATE…

Mais parcourons tout d’abord la requête multiple pour l’effacement de données.

Effacer plusieurs lignes en une seule requête (DELETE)

Au lieu de générer des requêtes dans le but d’effacer des lignes d’une table :

$mysql = Mysql(); //initialisation de l’objet

$mysql->Connect(); //connexion à la BD

$array = array(1,2,4); //lignes à effacer

FOREACH($array as $value) {

$sql = « DELETE FROM table_name WHERE id=’$value’ »;

$mysql->strictExecute($sql); //Exécution de la requête par l’objet $mysql

}

ce qui produira 3 requêtes dans cet exemple, vous pourriez faire la chose suivante :

$mysql = Mysql(); //initialisation de l’objet

$mysql->Connect(); //connexion à la BD

$array = array(1,2,4); //lignes à effacer

$sql = «  »;

FOREACH($array as $value) {

IF($sql <> «  ») $sql .=  » OR « ;

$sql .= « id=’$value’ »; //ajoute la chaîne id=’$value’ à $sql

}

$sql = « DELETE FROM table_name WHERE « .$sql; //construit la requête unique: DELETE FROM table_name WHERE id=’1′ OR id=’2′ OR id=’4′;

$mysql->strictExecute($sql); //Exécution de la requête par l’objet $mysql

ce qui produira une seule requête à la BD.

Je conseillerais même d’utiliser la sous-requête IN suivie de la condition :

$mysql = Mysql(); //initialisation de l’objet

$mysql->Connect(); //connexion à la DB

$array = array(1,2,4); //lignes à effacer

$sql = «  »;

FOREACH($array as $value) {

IF($sql <> «  ») $sql .= « , « ;

$sql .= « ‘$value’ »; //ajoute la chaîne id=’$value’ à $sql

}

$sql = « DELETE FROM table_name WHERE id IN (« .$sql. ») »; //construit la requête unique : DELETE FROM table_name WHERE id IN (’1′, ’2′, ’4′);

$mysql->strictExecute($sql); //Exécution de la requête par l’objet $mysql

Insérer plusieurs lignes en une seule requête (INSERT TO)

Pour insérer de multiples lignes en une seule requête, utilisez la requête suivante :

$mysql = Mysql(); //initialisation de l’objet

$mysql->Connect(); //connexion à la BD

$books = array(0=>array(« title »=> »Mysql explained », »n_pages »=> »350″),

1=>array(« title »=> »PHP explained », »n_pages »=> »150″)

); //lignes à insérer

$sql = «  »;

FOREACH($books as $value) {

IF($sql <> «  ») $sql .= « , « ;

$sql .= « (‘ ».$value["title"]. »‘,’ ».$value["n_pages"]. »‘) »;

}

$sql = « INSERT INTO table_name(title,n_pages) VALUES ».$sql;

$mysql->strictExecute($sql); //Exécution de la requête par l’objet $mysql

Mettre à jour plusieurs lignes (INSERT INTO… ON DUPLICATE KEY UPDATE)

Mettre à jour des lignes dans une table MySql peut se faire de la manière suivante :

$mysql = Mysql(); //initialisation de l’objet

$mysql->Connect(); //connexion à la BD

$books = array(0=>array(« id »=>1, »title »=> »Mysql explained », »n_pages »=> »450″),

1=>array(« id »=>2, »title »=> »PHP explained », »n_pages »=> »450″)

); //lignes à mettre à jour

$sql = «  »;

FOREACH($books as $value) {

$sql .= « UPDATE table_name SET title=’ ».$value["title"]. »‘,n_pages=’ ».$value["n_pages"]. »‘ WHERE id=’ ».$value["id"]. »‘ »;

$mysql->strictExecute($sql); //Exécution de la requête par l’objet $mysql

}

ce qui produira 2 requêtes.

Il est possible de n’en générer qu’une seule pour mettre à jour les 2 lignes par une requête INSERT INTO avec la syntaxe ON DUPLICATE KEY UPDATE. Dans le cas où la clef existe déjà (ici la valeur id = 1 et id = 2), MySql opérera un update. Si la clef n’existe pas, MySql fera un insert into classique :

$mysql = Mysql(); //initialisation de l’objet

$mysql->Connect(); //connexion à la BD

$books = array(0=>array(« id »=>1, »title »=> »Mysql explained », »n_pages »=> »450″),

1=>array(« id »=>2, »title »=> »PHP explained », »n_pages »=> »450″)

); //lignes à modifier

$sql = «  »;

FOREACH($books as $value) {

IF($sql <> «  ») $sql .= « , »;

$sql .= (‘ ».$value["id"]. »‘,’ ».$value["title"]. »‘,’ ».$value["n_pages"]. »‘);

}

$sql = « INSERT INTO table_name(id,title,n_pages) VALUES ».$sql. » ON DUPLICATE KEY UPDATEid=VALUES(id),title=VALUES(title),n_pages=VALUES(n_pages) »;

$mysql->strictExecute($sql); //Exécution de la requête par l’objet $mysql

Cette requête est tellement efficace qu’elle permet non seulement la mise à jour de plusieurs lignes, mais qu’elle inclut aussi l’insertion de nouvelles données, et ce, en une seule et même requête.

Webliographie :

MySql5 Release notes

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>