Aller au contenu

Maintenir une clé mysql régulière


Berberber

Sujets conseillés

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

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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.

:)

Lien vers le commentaire
Partager sur d’autres sites

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 ?

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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 :D

Plaisanterie mise à part, je ne savait pas que l'autoindex est réinitialisé quand on vide une table.

Modifié par Titag
Lien vers le commentaire
Partager sur d’autres sites

mais dans mon cas, la solution d'anonymus me semble un peu extravagante :D ...... pour l'objectif suivi ..... ;)

la solution random de mysql fonctionne très bien, ça va accelèrer mes scripts j'imagine :)

Lien vers le commentaire
Partager sur d’autres sites

  • 1 month later...
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 !

Lien vers le commentaire
Partager sur d’autres sites

  • 2 months later...
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 ?

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...