2009-12-05 14 views
5

Tengo una tabla como la siguiente,MYSQL: la forma de "reordenar" una mesa

| id | name | color | 
------+--------+--------- 
| 1 | pear | green | 
| 2 | apple | red | 
| 3 | banana | yellow | 
| 4 | grape | purple | 

me gustaría cambiar el orden alfabético usando la columna "Nombre" y restablecer el identificador (incremento automático) con esta nueva para terminar con la siguiente

| id | name | color | 
------+--------+--------- 
| 1 | apple | red | 
| 2 | banana | yellow | 
| 3 | grape | purple | 
| 4 | pear | green | 

PREGUNTA: ¿cómo puedo hacer esto con MySQL?

+3

¿Por qué quiere que la orden de identificación coincida con la del nombre? –

Respuesta

9

¿Puedo preguntar por qué querría hacer esto?

Si alguien modifica alguno de los valores de nombre o inserta nuevas filas, arruinará su esquema de pedido. Tratar de almacenar algún significado en el orden del PK que ya está disponible en otra parte de la tabla (la columna del nombre) parece redundante y, en consecuencia, una mala idea.

Una solución mucho mejor es no preocuparse por el valor de la columna ID y simplemente ordenar en la columna de nombre cuando usa los datos en su aplicación.

PS: Disculpa las respuestas que no responden. Normalmente supongo que tiene un buen motivo y solo respondo directamente a lo que intenta hacer, pero me di cuenta por sus otras preguntas que todavía está en las primeras etapas de aprendizaje sobre el diseño de la base de datos, así que quería ayudar te señala la dirección correcta en lugar de seguir avanzando hacia un enfoque desacertado.

+1

Ese es un buen punto. Si necesita un número único que corresponda al valor ordenado de cada cadena, puede agregar una columna adicional y actualizar según sea necesario. Reordenar la ID romperá las cosas mal si la ID se utiliza como una clave externa en otra tabla. –

+0

La única vez que sugeriría agregar una columna adicional para ordenar sería cuando el ordenamiento no puede determinarse por otras columnas en la tabla. Por ejemplo, si la aplicación permite a los usuarios reordenar los elementos arbitrariamente. – JohnFx

+1

Los registros forman un conjunto. No se supone que los conjuntos se ordenan en un orden específico. Recuerde que una teoría de base de datos relacional se basa en nociones matemáticas puras. Si desea un pedido específico en su aplicación, agregue una cláusula orderby; de lo contrario, el plan de ejecución decidirá cómo recuperar los datos y, por lo tanto, el orden; estos planes pueden cambiar con el tiempo. Además, recuerde que las claves sustitutivas no tienen sentido para el usuario final. – lmsasu

2

¿Por qué no agregar "PEDIR POR nombre ASC" al final de su pregunta? Supongo que necesitarás la identificación por algún motivo.

7

Puede SELECT INTO una nueva tabla de la tabla anterior, ordenando su selección como desee. Tener un ID de autoincremento en la nueva tabla. Si es necesario, suelte la tabla anterior y cambie el nombre de la nueva tabla.

-1
SELECT 
     RANK() Over (ORDER BY Name) As NewID 
    , Name 
    , Color 

FROM Fruits 

podría guardar en una tabla temporal y luego truncar luego truncar la tabla frutas y de inserción, pero es probablemente una mierda soluciones.

+0

MySQL no es compatible con funciones de ventana. –

13

La manera más limpia de reiniciar el incremento automático es crear otra tabla.

MySQL proporciona comandos como CREATE TABLE LIKE y RENAME TABLE que son útiles.

CREATE TABLE table2 LIKE table1; 

INSERT INTO table2 
    SELECT * FROM table1 ORDER BY name; 

DROP TABLE table1; 

RENAME TABLE table2 TO table1; 
+0

Eso está mal. No puede seleccionar todo (SELECCIONAR * DESDE tabla1), porque si lo hace, también copiará el PK con la misma asociación que tiene con la información de fila. Lo que te dejará con la misma tabla exacta que tiene el mismo nombre y color vinculado a la misma identificación, pero con un orden diferente. – MJoraid

+0

una corrección, deberá eliminar PK de la tabla 2 antes de insertar desde la tabla 1; luego, no seleccione *, pero seleccione todas las columnas a excepción de ID. y funcionará como un hechizo – Zalaboza

Cuestiones relacionadas