Décaler les enregistrement d'une table

Mr.White Messages postés 251 Date d'inscription   Statut Membre Dernière intervention   -  
mussaka_eti Messages postés 8 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour tout le monde !

Alors voici mon problème :

J'ai une table tout ce qu'il y a de plus classique avec une clef puis des donnée et je voudrai en faite inserer un enregistrement entre deux autre.

Ceci implique de décaler tout les enregistrements, c'est a dire que si on veut que le nouvel enregistrement soit le numero deux alors il faut faire passer le numero deux actuel en trois, le trois en quatre ...

On m'avait conseillé cette requête :

UPDATE tatable SET id = id + 1 WHERE id > 3

Mais seulement voila, lorsque l'enregistrement doit être incrémenté, imaginon qu'i passe de deux à trois, et bien le trois existe déjà et il me renvoye cette erreur Duplicata du champ '3' pour la clef 2.

Je cherche donc un moyen de commencer le update par la fin des enregistrement.

Merci d'avance !

Et si certaine zone d'ombre subsiste sur mon probleme, faite le moi savoir.
A voir également:

10 réponses

nebulus Messages postés 47 Date d'inscription   Statut Membre Dernière intervention   4
 
hello,

Y'a moyen avec un curseur qui parcours ta table à l'envers et tu fais donc ton update au moyen du curseur et ce dans l'ordre spécifié. Si tu as besoin de plus d'infos là-dessus, n'hésites pas, je te les fournis. ;-)
Mais un update de la clef, en principe, c'est pas trop recommandé. Tu es sûr que c'est nécessaire ?

@+
Nebulus
0
Jean-François Pillou Messages postés 19261 Date d'inscription   Statut Webmaster Dernière intervention   63 277
 
Je pense qu'à la base c'est une mauvaise idée de modifier les ID de cette façon. Que cherches-tu à faire exactement ? Quelle est la motivation de ce choix ?

Si c'est pour insérer un enregistrement entre deux autres, comme par exemple dans ce forum pour insérer un post au milieu, tu as d'autres façons de faire... Sinon tu perds tout l'intérêt de la base de données ! Arrivé à 10 000 enregistrements, tu seras obligé de faire un update sur plusieurs milliers d'entre eux à chaque insertion !

Je pense qu'il est sûrement plus opportun de faire un autre champ et de faire un "order by" sur ce champ. Ce champ pourra être quelque chose du genre 1, 2, 3, 4, ... puis lorsque tu insères un champ après 2, il suffira de mettre 2.1, ...
Sinon par récursivité en faisant un champ "Parent", dans lequel tu mets l'ID du père...
0
nebulus Messages postés 47 Date d'inscription   Statut Membre Dernière intervention   4
 
Je ne peux qu'appuyer à 100%.
C'était bien en substance ce qui se cachait derrière "Tu es sûr que c'est nécessaire ?" ;-))

@+
0
Reivax
 
Sinon, juste par curiosité...
Et si ta requête tu la changeais en

UPDATE tatable SET id = id + 1 WHERE id > 3 ORDER BY id DESC

Ca marcherait ?
0
Jean-François Pillou Messages postés 19261 Date d'inscription   Statut Webmaster Dernière intervention   63 277
 
Jamais de "order by" dans une clause UPDATE ...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Mr.White Messages postés 251 Date d'inscription   Statut Membre Dernière intervention   53
 
En faite, ce que je cherche à faire un inserant une enregistrement entre deux autres est de garder un ordre car lors de l'affrichage je reprend l'ordre des id, il me fallait donc changer l'ordre de ces dernier lors de l'insertion d'un enregistrement.

Je comprend trés bien que ce n'est pas la meilleur solution mais sur le cout je n'avais pas pensé que s'il y avait 10 000 enregistrement ca commencerai à être vraiment lourd, mais bon, en réalité il ne peut y avoir plus de 100 enregistrement (et je doute que ca ateigne cette valeur) donc finalement je pense que je peut me permettre ce petit écart.

J'ai donc réussi à résoudre mon problème avec ce code :


for($i=$nb_enreg-1;$i>=$id_table;$i--)
{

$requette_decal = "UPDATE $nom_table SET $nom_id_table = $i + 1 WHERE $nom_id_table = $i";
echo '<br><br>'.$requette_decal.'<br>';
$resultat_requette_decal = mysql_query($requette_decal, $db_insertion) or die('erreur lors du décalage des enregistrements.<br>Erreur : '.mysql_error());
}


PS: si vous avez d'autre proposition où que quelque chose dans ce code ne va pas ... Corrigé moi, merci !

;o)
0
BreTzeL Messages postés 59 Date d'inscription   Statut Membre Dernière intervention   24
 
salut.
perso, je pense que ca fait beaucoup de requetes pour une simple insertion. tu ne pourrais pas trouver un autre critere de tri? un autre champ comme deja proposé au dessus?
0
Mr.White Messages postés 251 Date d'inscription   Statut Membre Dernière intervention   53
 
En faite, je croit que la récursivité serai la meilleur solution mais comme je n'aurai jamais plus de 100 enregistrement je croit que je peut me permettre ce petit écart.

Et puis c'est compliqué la récursivité... ;o)
0
jisisv Messages postés 3645 Date d'inscription   Statut Modérateur Dernière intervention   934
 
Hello,
Je ne vois pas fort l'intérêt de ta manip.
Un ID sert en général à effectuer un lien vers une autre table.
(ou alors c'est que tu ne fais pas de bdd relationnelle).
Tu n'as pas un autre critère de tri?
( l'emplacement où tu "insère" le t-uple,tu dois bien le déterminer à l'aide d'un algorithme quelconque non?)

Johan
The software said "Requires Windows98, Win2000, or better,
So I installed Unix.
0
Mr.White Messages postés 251 Date d'inscription   Statut Membre Dernière intervention   53
 
Non, il n'y a pas vraiment d'algoithme puisque je récupère ce que l'utilisateur à mis.

En fait, on pourrai dire que ma clef sert également d'ordre.

Cette ordre n'est utilile que lors de l'affichache (ou presque).
0
mussaka_eti Messages postés 8 Date d'inscription   Statut Membre Dernière intervention   8
 
je voudrais un cours en algorithme qui traite des enregistrements
0