2010-01-18 4 views
7

J'ai une table avec beaucoup de lignes mais elles sont en panne. Im en utilisant le champ "id" comme clé primaire. J'ai aussi un champ "date" qui est un champ datetime.comment reindex mysql table

Comment pourrais-je réindexer la table afin que les entrées sont a identifié dans l'ordre chronologique selon le champ de date

+5

S'attendre à ce que les lignes soient * stockées * dans un ordre particulier dans n'importe quelle base de données relationnelle n'est probablement pas une bonne idée. C'est à cela que servent les index et les ORDER BY. Les ID sont juste des identifiants; si le type important est par date/heure, qui se soucie de ce que sont les identifiants? – Joe

Répondre

8

la façon dont je le ferais est de créer une nouvelle table avec un indice d'incrémentation automatique et il suffit de sélectionner tous votre vieille table en l'ordonnant par date. vous pouvez ensuite retirer votre ancienne table.

6

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

ALTER TABLE test_table ADD COLUMN id2 int unsigned not null; 
SET @a:=0; 
UPDATE test_table SET [email protected]:[email protected]+1 ORDER BY `date`; 
ALTER TABLE test_table DROP id; 
ALTER TABLE test_table CHANGE id2 id int UNSIGNED NOT NULL AUTO_INCREMENT, 
    ADD PRIMARY KEY (id); 

Gardez à l'esprit que vous ne pouvez jamais garantir l'ordre d'une colonne auto-incrémentée une fois que vous commencez à insérer et la suppression des données, de sorte que vous ne devriez pas compterez sur toute commande, sauf ce que vous spécifiez à l'aide ORDER BY dans votre requêtes. C'est une opération coûteuse que vous faites, car elle nécessite que les index soient complètement recréés, donc je ne suggérerais pas de le faire souvent. Pourquoi voulez-vous que la séquence d'ID soit corrélée avec les dates?

9

Il semble que vous voulez faire ORDER BY id et que les lignes reviennent dans l'ordre de la date. Si vous souhaitez des lignes dans l'ordre des dates, utilisez plutôt ORDER BY date.

Les valeurs d'une colonne d'ID d'auto-incrémentation doivent être traitées comme arbitraires. S'en remettre à vos identifiants dans l'ordre des dates est une mauvaise idée.

2

Vous pouvez utiliser ALTER TABLE t ORDER BY col; La syntaxe autorisée de ORDER BY est identique à celle des instructions SELECT.

8

Que diriez-vous quelque chose comme une simple requête en utilisant une variable:

set @ROW = 0; 
UPDATE `tbl_example` SET `id` = @ROW := @ROW+1 ORDER BY `fld_date` ASC; 

Cela commander vos lignes comme: 0,1,2,4,5 ... etc par date.

+0

Ceci ne réinitialisera pas le compteur d'incrémentation automatique –

+0

J'ai dû changer cette première ligne en 'set @ROW = 0;' et cela a fonctionné –

0

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

ASSUREZ-VOUS A SAUVEGARDE DE VOTRE TABLE, Y COMPRIS LA STRUCTURE ET LES DONNÉES AVANT DE COMMENCER CETTE INTERROGATION!

ALTER TABLE your_table ADD COLUMN temp_id INT UNSIGNED NOT NULL; 
SET @a:=0; 
UPDATE your_table SET [email protected]:[email protected]+1 ORDER BY `date` ASC; 
ALTER TABLE your_table DROP id; 
ALTER TABLE your_table CHANGE temp_id id INT UNSIGNED NOT NULL AUTO_INCREMENT, ADD PRIMARY KEY (id); 
ALTER TABLE your_table CHANGE COLUMN id id INT(10) FIRST; 

Il suffit de ne pas oublier de changer « your_table » avec le nom de votre table, et l'ordre des colonnes. Ici, je vous expliquer ce que vous faites cette étape de façon à pas:

  1. 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 à ce que vous voulez pour votre ID à partir de);
  3. Ensuite, vous mettez à jour votre table, rangée par rangée par la logique ORDER, en définissant une valeur pour votre nouvelle colonne "temp_id" égale à la variable que vous avez définie, puis incrémentez cette variable par 1 (vous pouvez faire quelque chose de funky ici, par exemple si vous voulez que vos identifiants soient toujours pairs, vous pouvez définir @ a + 2);
  4. L'étape suivante consiste à supprimer (supprimer) votre ancien ID de colonne;
  5. Ensuite, vous changez le nom de votre colonne temp_id en ID et en entier positif avec incrément automatique qui est la clé primaire de votre table.
  6. Parce que ID est maintenant la colonne temp_id nouvellement ajoutée, il se trouve à la fin de votre structure de table. Pour le déplacer à nouveau en tant que première colonne, vous exécutez la dernière requête, pour vous assurer que c'est la première colonne.