Berberber Posté 30 Septembre 2004 Posté 30 Septembre 2004 Bonjour j'ai un petit blocage.... Dans une table, J'ai une clé-index, qui commences à 1 et s'incrèmente regulièrement, donc au départ tout va bien. Maintenant j'enleves une ligne. Que faire pour que cette colonne clé garde sa régularité. (Sans refaire toute la table) . Y a il une solution intégrée à MYSQL pour cela ? Merci d'avance. Bernhard
Ganf Posté 1 Octobre 2004 Posté 1 Octobre 2004 Première question : pourquoi cherches tu à faire ça ? Parce que normalement les identifiants en auto-increment sont faits pour être des identifiants neutres. Ils pourraient être aléatoire que ça ne changerait rien. Si tu cherches à ne pas avoir de trous c'est probablement que tu t'en sers pour autre chose que ce que tu devrais (dans ce cas penses à faire autrement ou utiliser un autre champ de ta DB) ou que ce n'est que cométique, parce que c'est plus joli (en ce cas oublie, ce n'est pas fait pour être joli). Et globalement, la conclusion suite au paragraphe précédent : tu peux pas, simplement parce qu'il n'y a aucune raison de pouvoir.
Titag Posté 1 Octobre 2004 Posté 1 Octobre 2004 Salut, Ce que tu veux faire n'a pas vraiment de sens, puisque la clé dont tu parles est l'identifiant de chaque enregistrement de ta base. Son empreinte digitale en quelque sorte, unique. En revanche, je sais que si tu vide entierement ta table (delete from table) et que tu réinsère des enregistrements, ta clé ne va pas repartir de 1. Elle va continuer de s'incrémenter comme si ta table contenait encore toutes les anciennes données. Pour réinitialiser la valeur de départ de l'incrémentation, il faut modifier la valeur Autoindex associée à ta table. C'est possible avec phpmyadmin : rubrique Opérations.
Berberber Posté 1 Octobre 2004 Auteur Posté 1 Octobre 2004 Alors, tout d'abord, merci pour vos réponses..... et je préçise donc mon problème. Imaginons que j'ai un tableau avec 4000 valeurs, et je veux en prendre une au hasard, je generes un nombre entre 1 et 4000, et vais chercher cette ligne par la suite, en utilisant la clé correspondante. C'est un systeme que j'ai déjà utilisé sur des tableaux fixes........qui ne fonctionne plus sur un tableau variable...... donc que faire ?
Titag Posté 1 Octobre 2004 Posté 1 Octobre 2004 Tu peux faire : SELECT * FROM matable ORDER BY RAND LIMIT 1 Je ne suis pas sur de la syntaxe mais c'est l'idée.
Berberber Posté 1 Octobre 2004 Auteur Posté 1 Octobre 2004 Merci, ça sonne vraiment bien, j'essaye tout de suite.
Anonymus Posté 1 Octobre 2004 Posté 1 Octobre 2004 Juste une précision : DELETE FROM tablename vide la table, et réinitialise le compteur d'incrémentation. Donc, en transférant la table dans une table temporaire, en 'vidant' la table, et en retransférant la table, tu obtiens une table avec des numéros qui se suivent. Mais il est vrai que cela n'a plus de sens, dans la mesure où, comme il est déjà précisé, l'auto-index est justement fait pour que les numéros ne repartent pas à zéro, et que l'on ne soit pas obligé d'en suivre l'ordre. Nico.
Titag Posté 1 Octobre 2004 Posté 1 Octobre 2004 (modifié) Dans un autre post, je cite fr.php.net comme étant une des bibles de php... mais j'ai oublié Anonymous. Je fait ici mon mea culpa Plaisanterie mise à part, je ne savait pas que l'autoindex est réinitialisé quand on vide une table. Modifié 1 Octobre 2004 par Titag
Berberber Posté 1 Octobre 2004 Auteur Posté 1 Octobre 2004 mais dans mon cas, la solution d'anonymus me semble un peu extravagante ...... pour l'objectif suivi ..... la solution random de mysql fonctionne très bien, ça va accelèrer mes scripts j'imagine
Touffy-Chouchen Posté 12 Novembre 2004 Posté 12 Novembre 2004 ALTER TABLE ta_table AUTO_INCREMENT = 15 // ici j'ai mis 15 si tu veux reprendre à 15
Titag Posté 15 Novembre 2004 Posté 15 Novembre 2004 ALTER TABLE ta_table AUTO_INCREMENT = 15// ici j'ai mis 15 si tu veux reprendre à 15 <{POST_SNAPBACK}> Et si il y a un id égal à 16 ? Mysql accepte de faire la mise à jour ? A tester mais selon moi c'est dangereux !
Berberber Posté 24 Janvier 2005 Auteur Posté 24 Janvier 2005 La syntaxe exacte est : ORDER BY RAND() <{POST_SNAPBACK}> cette methode est moyenne when selecting a single random row you have to use a query like this: SELECT ... FROM my_table ORDER BY RAND() LIMIT 1.as explain shows, mysql optimizes this VERY badly (or may be better said, doens't optimize it at all): it uses an temporary table and an extra filesort. couldn't this be optimized?! la solution suivante est proposée : LOCK TABLES foo READ;SELECT FLOOR(RAND() * COUNT(*)) AS rand_row FROM foo;SELECT * FROM foo LIMIT $rand_row, 1;UNLOCK TABLES; Vous avez une meilleure idée, avant que je change tous mes scripts ?
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant