2010-01-18 23 views
7

Tengo una tabla con muchas filas pero están fuera de servicio. Estoy usando el campo "id" como la clave principal. También tengo un campo de "fecha" que es un campo de fecha y hora.cómo reindexar la tabla de mysql

¿Cómo podría indexar la tabla para que las entradas se identificó en orden cronológico de acuerdo con el campo de fecha

+5

Esperar que las filas * se almacenen * en un orden particular en cualquier base de datos relacional probablemente no sea una buena idea. Esto es para lo que son los índices y ORDER BYs. Los ID son solo identificadores; si el tipo importante es por fecha/hora, ¿a quién le importan cuáles son los ID? – Joe

Respuesta

8

la forma en que lo haría es crear una nueva tabla con el índice de incremento automático y simplemente seleccionar todo su vieja mesa ordenada por fecha. a continuación, puede eliminar su tabla anterior.

6

El siguiente fragmento de SQL debe hacer lo que desee.

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); 

Tenga en cuenta que nunca se puede garantizar el orden de una columna de auto-incrementales una vez que comience la inserción y extracción de datos, por lo que no debería estar confiando en cualquier orden excepto que el que se especifica el uso de ORDER BY en su consultas. Esta es una operación costosa que está haciendo, ya que requiere que los índices sean completamente recreados, por lo que no recomendaría hacerlo a menudo.

9

¿Por qué quiere que la secuencia de identificaciones se correlacione con las fechas? Parece que quiere hacer ORDER BY id y hacer que las filas vuelvan en orden de fecha. Si quiere filas en orden de fecha, simplemente use ORDER BY date.

Los valores en una columna de ID de autoincrement deben tratarse como arbitrarios. Confiar en que sus identificaciones estén en orden de fecha es una mala idea.

2

Puede usar ALTER TABLE t ORDER BY col; La sintaxis permitida de ORDER BY es como en las sentencias SELECT.

8

¿Qué tal algo así como una consulta sencilla utilizando una variable:

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

Esto ordenar sus filas como: 0,1,2,4,5 etc ... por su fecha.

+0

Esto no restablecerá el contador de incremento automático –

+0

Tuve que cambiar la primera línea para 'establecer @ROW = 0;' y luego funcionó –

0

Tuve que hacer algo similar. La mejor manera de hacerlo era la siguiente (se puede ejecutar en una consulta SQL si quieres, pero ten en cuenta que se trata de un consumo de recursos operación lenta y muy):

Asegúrese de hacer una RESPALDO DE TU MESA, INCLUYENDO ESTRUCTURA Y DATOS ANTES DE COMENZAR ESTA CONSULTA!

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; 

Pero no se olvide de cambiar "your_table" con el nombre de la tabla, y el orden por columnas. Aquí os explico lo que está haciendo este camino paso a paso:

  1. En primer lugar se agrega una nueva columna llamada "temp_id" (asegurarse de que no es un nombre que ya está usando);
  2. A continuación, agrega una variable de temperatura igual a 0 (o lo que desee para que su ID comience en);
  3. Luego actualiza su tabla, fila por fila, mediante la lógica de ORDEN establecida, estableciendo un valor para su nueva columna "temp_id" igual a la variable que ha establecido, luego incremente esta variable en 1 (puede hacer algo funky aquí, por ejemplo, si quiere que sus identificaciones sean siempre iguales, puede establecer @ a + 2);
  4. En el siguiente paso suelta (elimina) su ID de columna anterior;
  5. Luego cambia el nombre de su columna temp_id a ID y lo identifica como un entero positivo con incremento automático que es la clave principal de su tabla.
  6. Como ID ahora es la columna temp_id recién agregada, se encuentra al final de la estructura de la tabla. Para moverlo nuevamente como primera columna, ejecuta la última consulta para asegurarse de que sea la primera columna.