Bonjour,
dans le cadre d'un script permettant de décaler les id (PRIMARY KEY) d'une table dans un sens ou dans l'autre, je rencontre un problème qui pourrait peut-être se résoudre en changeant la façon dont la requête est interprétée par le moteur MySQL.
Si je part d'une simple table dont [id] est une clé primaire comme ceci :
1 2 3 4 5
|
id valeur
5 Valeur#1
6 Valeur#2
7 Valeur#3 |
Je peux sans problème la décaler vers une valeur inférieure en une ligne :
UPDATE maTable SET id = id - 1
Cela me donne la table suivante :
1 2 3 4 5
|
id valeur
4 Valeur#1
5 Valeur#2
6 Valeur#3 |
Cela fonctionne sans problème car il n'existe pas de collision interne entre les id lors de l’exécution (5 passe à 4, puis 6 passe à 5...)
Par contre, si je souhaite incrémenter l'id de 1 pour obtenir ce résultat :
1 2 3 4 5
|
id valeur
6 Valeur#1
7 Valeur#2
8 Valeur#3 |
Cela ne fonctionnera pas car en commençant par la première valeur (6), il ne pourra pas lui donner une valeur incrémentée (7) car celle-ci est déjà occupée par la ligne suivante. La requête est interrompue.
L'idée serait de faire travailler cette fonction en partant de la fin vers le début.
J'ai essayé d'utiliser le mot clé DESC en espérant que cela fonctionne sans succès :
UPDATE maTable SET id = id + 1 DESC
J'ai également tenter de trouver des solutions sur le web sans succès également.
Actuellement, je passe par une boucle en php qui modifie ligne par ligne chacune des valeurs en partant de la fin.
Ça fonctionne, mais ce n'est ni élaguant ni optimisé, donc, si par hasard, vous avez une idée permettant de modifier l'ordre interne d’exécution de MySQL ou même une méthode alternative permettant d’exécuter le tout en une seule ligne, je suis preneur.
Merci d'avoir pris le temps de me lire !
Partager