11
votes

Comment réindex Table MySQL

J'ai une table avec de nombreuses lignes, mais ils sont hors de l'ordre. Je suis à l'aide du champ "ID" comme clé primaire. J'ai aussi un champ "Date" qui est un champ DateTime.

Comment puis-je réindex de la table de sorte que les entrées soient identiques dans l'ordre chronologique en fonction du champ de date


1 commentaires

S'attendre à ce que les lignes soient stockées dans un ordre particulier dans une base de données relationnelle n'est probablement pas une bonne idée. C'est ce que sont les indices et les commandes. Les identifiants sont juste des identificateurs; Si le tri important est par date / heure, qui se soucie de ce que sont les identifiants?


7 Réponses :


12
votes

La façon dont je voudrais le faire est de créer une nouvelle table avec l'index d'incrément automatique et de sélectionner tout votre ancienne table à commander par date. Vous pouvez ensuite retirer votre ancienne table.


1 commentaires

INCROYABLE! Grande solution. Je vais l'appliquer à mon dB en fait.



9
votes

L'extrait SQL suivant devrait faire ce que vous voulez. XXX

Gardez à l'esprit que vous ne pouvez jamais garantir l'ordre d'une colonne incrémentée automatique une fois que vous avez commencé à insérer et à supprimer des données, donc vous ne devrait pas s'appuyer sur une commande, sauf que vous spécifiez à l'aide de la commande par dans vos requêtes. C'est une opération coûteuse que vous faites, car elles nécessitent des indices pour être complètement recréées, donc je ne suggérerais pas de le faire souvent.


1 commentaires

Pour récupérer la colonne ID dans la première colonne, ajoutez ceci: ALTER TABLE TEST_TABLE Change ID ID ID INT NON NULL AUTO_INCREMENT PREMIER;



9
votes

Pourquoi voulez-vous que la séquence d'identifiants soit corrélée aux dates? On dirait que vous voulez faire commander par ID et que les lignes reviennent à la date d'ordre. Si vous souhaitez ordre des lignes de date, utilisez simplement ordre par date à la place.

Les valeurs dans une colonne d'identification automatique d'autocrampe doivent être traitées comme arbitraires. S'appuyant sur vos identifiants étant à la date d'ordre est une mauvaise idée.


0 commentaires

2
votes

Vous pouvez utiliser Alter Table Commande Par col; La syntaxe autorisée de l'ordre par est comme dans les états sélectionnés.


0 commentaires

14
votes

Que diriez-vous de quelque chose comme une requête simple à l'aide d'une variable: xxx

Ceci commandera vos lignes comme: 0,1,2,4,5 ... etc. à votre date. < / p>


2 commentaires

Cela ne réinitialisera pas le compteur d'incrément automatique


J'ai dû changer cette première ligne à Set @row = 0; et ensuite cela a fonctionné



1
votes

Je devais faire quelque chose de similaire. La meilleure façon de le faire était la suivante ( vous pouvez l'exécuter dans une requête SQL si vous le souhaitez, mais à l'esprit à l'esprit que ceci est une opération de consommation lente et très ressources ):

Assurez-vous de faire une sauvegarde de votre table, y compris la structure et les données avant de commencer cette requête! xxx

n'oubliez pas de changer "your_table" avec Le nom de votre table et la commande par colonnes. Ici, je vous explique ce que vous faites de cette façon étape par étape:

  1. Tout d'abord, vous ajoutez une nouvelle colonne nommée "temp_id" ( Assurez-vous que ce n'est pas un nom que vous utilisez déjà );
  2. Ensuite, vous ajoutez une variable TEMP égale à 0 ( ou à tout ce que vous voulez pour que votre identifiant commence à partir de );
  3. Vous mettez ensuite à jour votre table, rangée à ligne par la logique de commande définie, définissant une valeur pour votre nouvelle colonne "TEMP_ID" égale à la variable que vous avez définie, puis incrémenter cette variable de 1 ( vous pouvez faire Quelque chose de funky ici, par exemple si vous voulez que votre identifiant soit toujours même, vous pouvez définir @ A + 2 );
  4. étape suivante Vous déposez (supprimer) votre ancien identifiant de colonne;
  5. Ensuite, vous modifiez le nom de votre colonne Temp_id en arrière sur ID et en tant qu'intéger positif avec incrément automatique qui est la clé primaire de votre table.
  6. Parce que l'ID est maintenant la colonne Temp_id nouvellement ajoutée, elle est située à la fin de votre structure de table. Pour le déplacer à nouveau comme première colonne, vous exécutez la dernière requête pour vous assurer que c'est la première colonne.

0 commentaires

1
votes

Si vous utilisez quelque chose comme phpmysql, cela pourrait être atteint par:

  • Aller à la table (liste côté gauche des dB et des tables), puis
  • à partir des options de la barre supérieure Sélectionnez "SQL". Suivez les conseils de @ryun, puis passez à "Opérations" (à partir de la barre supérieure),
  • Recherchez "Options de table", laissez tout sauf 'auto_incrènement' inchangé,
  • Définissez la valeur 'auto_incrènement' sur 1 et appuyez sur Go en bas du formulaire.

    Que va-t-il faire, dans tous?

    • Il définira les colonnes d'identification de chaque de 1 à {compte}.
    • Ensuite, il réinitialisera l'index de la table de sorte que votre prochaine ligne insérée soit égale au +1 le nombre de colonnes (et non +1 l'ancien index).

      @WYZARD a fait référence à simplement commander les colonnes par date lorsque vous les récupérez de la table (et non de réindexation). Depuis, en effet, la clé primaire devrait être arbitraire (sauf à toutes les clés étrangères et peut-être la plate-forme de consommation (mais c'est une autre question)).


0 commentaires