MYSQL: como “reordenar” uma mesa
-
13-09-2019 - |
Pergunta
Eu tenho uma tabela como a seguinte,
| id | name | color |
------+--------+---------
| 1 | pear | green |
| 2 | apple | red |
| 3 | banana | yellow |
| 4 | grape | purple |
Eu gostaria de reordenar em ordem alfabética usando a coluna "nome" e redefinir o id (autoincrement) com este novo fim de acabar com o seguinte
| id | name | color |
------+--------+---------
| 1 | apple | red |
| 2 | banana | yellow |
| 3 | grape | purple |
| 4 | pear | green |
Pergunta ??strong>: como eu posso fazer isso com o MySQL
Solução
Posso perguntar por que você iria querer fazer isso?
Se alguém modifica quaisquer dos valores de nome ou inserções novas linhas que vai atrapalhar o seu esquema de ordenação. Tentando armazenar algum significado no ordenamento do PK que já está disponível em outros lugares na tabela (a coluna nome) parece redundante e consequentemente uma má idéia.
Uma solução muito melhor é não se preocupar com o valor da coluna ID e apenas uma espécie na coluna de nome quando você usar os dados em seu aplicativo.
PS: Desculpe pela resposta do tipo não-resposta. Normalmente eu supor que você tinha um bom motivo e apenas dar uma resposta que diretamente endereços que você está tentando fazer, mas eu notei de suas outras perguntas que você ainda está nos estágios iniciais de aprendizagem sobre o projeto de banco de dados, então eu queria ajuda apontá-lo na direção certa em vez de ajudar ainda mais o seu progresso em direção a uma abordagem mal aconselhado.
Outras dicas
A maneira mais limpa para repor o auto incremento é criar outra tabela.
MySQL fornece comandos como CREATE TABLE LIKE
e RENAME TABLE
que são úteis.
CREATE TABLE table2 LIKE table1;
INSERT INTO table2
SELECT * FROM table1 ORDER BY name;
DROP TABLE table1;
RENAME TABLE table2 TO table1;
Você pode SELECT INTO uma nova tabela a partir da tabela antiga, ordenando a sua escolha em como desejado. Possui uma ID auto-incremento na nova tabela. Se necessário, soltar a tabela antiga e renomeie a nova tabela.
Por que não acrescentar "ORDER BY nome ASC" no final da sua consulta? Meu palpite seria que você precisa do ID por algum motivo.
SELECT
RANK() Over (ORDER BY Name) As NewID
, Name
, Color
FROM Fruits
poderia salvar em uma tabela temporária, em seguida, truncar, em seguida, truncar a tabela frutas e inserção, mas é provavelmente uma soluções de baixa qualidade.