Décaler les enregistrement d'une table

Fermé
Mr.White Messages postés 251 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 17 juillet 2012 - 29 juil. 2003 à 13:00
mussaka_eti Messages postés 8 Date d'inscription mercredi 25 avril 2007 Statut Membre Dernière intervention 13 mars 2008 - 10 mai 2007 à 16:53
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 mardi 29 juillet 2003 Statut Membre Dernière intervention 1 septembre 2004 4
29 juil. 2003 à 16:38
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 18306 Date d'inscription lundi 15 février 1999 Statut Webmaster Dernière intervention 16 février 2023 63 274
29 juil. 2003 à 16:50
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 mardi 29 juillet 2003 Statut Membre Dernière intervention 1 septembre 2004 4
29 juil. 2003 à 22:44
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
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 18306 Date d'inscription lundi 15 février 1999 Statut Webmaster Dernière intervention 16 février 2023 63 274
29 juil. 2003 à 23:00
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 jeudi 24 avril 2003 Statut Membre Dernière intervention 17 juillet 2012 53
30 juil. 2003 à 10:56
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 mardi 22 juillet 2003 Statut Membre Dernière intervention 28 juin 2005 24
30 juil. 2003 à 12:06
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 jeudi 24 avril 2003 Statut Membre Dernière intervention 17 juillet 2012 53
31 juil. 2003 à 11:49
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 dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
31 juil. 2003 à 12:20
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 jeudi 24 avril 2003 Statut Membre Dernière intervention 17 juillet 2012 53
4 août 2003 à 10:52
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 mercredi 25 avril 2007 Statut Membre Dernière intervention 13 mars 2008 8
10 mai 2007 à 16:53
je voudrais un cours en algorithme qui traite des enregistrements
0