Utiliser des variables dans MySQL

Dans le développement de pages web, la notion de variable est très fréquemment associée au langage de script (ASP, PHP). Mais MySQL peut en utiliser également, ce qui peut s’avérer être plus simple à administrer pour le développeur, et moins gourmand en ressources.

mysql> select * from t1;
+------+------+
| c1   | c2   |
+------+------+
|    1 | aaa  |
|    2 | bbb  |
|    3 | ccc  |
|    4 | ddd  |
|    5 | eee  |
+------+------+
5 rows in set (0.00 sec)
 
mysql> select @total := COUNT(*) as "@total" from t1;
+--------+
| @total |
+--------+
|      5 |
+--------+
1 row in set (0.01 sec)
 
mysql> select * from t1 where c1 = @total;
+------+------+
| c1   | c2   |
+------+------+
|    5 | eee  |
+------+------+
1 row in set (0.01 sec)

Il est également possible d’affecter directement une valeur à une variable :

mysql> select * from t1;
+------+------+
| c1   | c2   |
+------+------+
|    1 | aaa  |
|    2 | bbb  |
|    3 | ccc  |
|    4 | ddd  |
|    5 | eee  |
+------+------+
5 rows in set (0.00 sec)
 
mysql> set @valeur = 4;
Query OK, 0 rows affected (0.00 sec)
 
mysql> select * from t1 where c1 = @valeur;
+------+------+
| c1   | c2   |
+------+------+
|    4 | ddd  |
+------+------+
1 row in set (0.00 sec)

Notez que dans ce cas, il faut utiliser simplement le signe « = » et non « := » comme précédemment.

Un exemple d’utilisation concrète : comment faire pour qu’une table aux clés primaires décousues (1,3,8,14,15…) soit de nouveau bien ordonnée (1,2,3,4,5…) [1] ? Sélectionner chaque entrée de la table et l’ajouter dans une autre table ? C’est lourd… Faire une boucle et envoyer une instruction UPDATE pour chaque entrée de la table ? C’est lourd…

MySQL le fait avec seulement une variable et une requête :

mysql> select * from t1;
+------+------+
| c1   | c2   |
+------+------+
|    1 | aaa  |
|    3 | bbb  |
|    8 | ccc  |
|   14 | ddd  |
|   15 | eee  |
+------+------+
5 rows in set (0.00 sec)
 
mysql> set @valeur = 0;
Query OK, 0 rows affected (0.00 sec)
 
mysql> update t1 set c1 = @valeur := @valeur + 1;
Query OK, 4 rows affected (0.00 sec)
Rows matched: 5  Changed: 4  Warnings: 0
 
mysql> select * from t1;
+------+------+
| c1   | c2   |
+------+------+
|    1 | aaa  |
|    2 | bbb  |
|    3 | ccc  |
|    4 | ddd  |
|    5 | eee  |
+------+------+
5 rows in set (0.00 sec)

[1] : avec un champ auto-incrémenté et des instructions DELETE à répétition, on a vite fait de se retrouver dans ce genre de situation.



Laisser un commentaire

Votre commentaire