Como mover colunas em uma tabela MySQL?


207

Atualmente, estou tendo a seguinte tabela MySQL: Employees (empID, empName, department);

Quero alterar a tabela para o seguinte: Employees (empID, department, empName);

Como isso pode ser feito usando ALTERinstruções?

Nota: quero alterar apenas as posições da coluna.


Posso perguntar por que? A ordem das colunas é basicamente apenas um problema estético ...
deceze

6
não @deceze talvez - que define a ordem de valores em um SELECT *comunicado. (Com certeza, se a ordem de valores é importante, deve-se incluí-los explicitamente na declaração, mas que talvez OP não tem total controle aqui.)
Ted Hopp

1
Eu sei que isso não afeta nada. Minha tabela original está tendo muitas colunas, então acabei de adicionar 3 colunas que foram adicionadas na última. Mas eu quero que eles sejam exibidos nas posições 3-4-5 para facilitar o uso da SELECTdeclaração
sumit

6
@ iSumitG: Observe também que também AFTER columnpode ser usado ALTER TABLE ADD column. (para a próxima vez que você adicionar alguns campos).
ypercubeᵀᴹ

2
Ao carregar um despejo mysql, ele usa insert em valores. Portanto, se você, por exemplo, estiver carregando dados do prod no dev e as colunas estiverem fora de ordem, você receberá um erro. É por isso que alguém pode querer fazer isso.
Hooray estou ajudando

Respostas:


345

Se empName for uma coluna VARCHAR (50):

ALTER TABLE Employees MODIFY COLUMN empName VARCHAR(50) AFTER department;

EDITAR

Pelos comentários, você também pode fazer isso:

ALTER TABLE Employees CHANGE COLUMN empName empName VARCHAR(50) AFTER department;

Observe que a repetição de empNameé deliberada. Você precisa dizer ao MySQL que deseja manter o mesmo nome de coluna.

Você deve estar ciente de que as duas versões de sintaxe são específicas para o MySQL. Eles não funcionam, por exemplo, no PostgreSQL ou em muitos outros DBMSs.

Outra edição: como apontado por @Luis Rossi em um comentário, você precisa especificar completamente a definição de coluna alterada antes do AFTERmodificador. Os exemplos acima apenas têm VARCHAR(50), mas se você precisar de outras características (como NOT NULLou um valor padrão), precisará incluí-las também. Consulte os documentosALTER TABLE para obter mais informações.


6
Apenas uma nota: Modificar não é suportado até a versão 4.
Erre Efe

4
Você precisa repetir o nome da coluna, porque a sintaxe pressupõe que você queira alterar o nome da coluna. Por exemplo: ALTER TABLE Funcionários ALTERAR COLUNA empName empName varchar (50) DEPOIS do departamento;
Brianjcohen 14/11

Lembre-se de que a ordem alterada não será refletida nos dumps SQL do banco de dados.
skalee

3
@SalehEnamShohag - Sim, de acordo com os documentos , a COLUMNpalavra-chave é opcional nas ALTER TABLEdeclarações. Prefiro usá-lo porque acho que torna a declaração mais legível.
Ted Hopp 29/03

1
Funciona bem para mim, no meu caso eu precisava definir que a coluna era NOT NULL DEFAULT 1, isso é feito logo após o tipo de coluna no exemploVARCHAR(50)
Luiz Rossi

67

Alterar posição da coluna:

ALTER TABLE Employees 
   CHANGE empName empName VARCHAR(50) NOT NULL AFTER department;

Se você precisar movê-lo para a primeira posição, deverá usar o termo PRIMEIRO no final da consulta ALTER TABLE CHANGE [COLUMN]:

ALTER TABLE UserOrder 
   CHANGE order_id order_id INT(11) NOT NULL FIRST;

24
Mencionando como movê-lo para a primeira posição foi bastante útil
Tristian

2
Alguma idéia de como isso funcionaria em uma mesa grande? Isso está apenas alterando alguns metadados ou ele realmente precisa reorganizar os dados no disco?
Kip

6
deixa pra lá, respondi minha própria pergunta tentando em uma tabela que eu tinha com 3.9M linhas, levou cerca de 2 minutos. definitivamente, está fazendo mais do que apenas trocar alguns metadados.
Kip

14

O phpMyAdmin fornece uma GUI para isso na exibição de estrutura de uma tabela. Marque para selecionar a coluna que deseja mover e clique na ação de alteração na parte inferior da lista de colunas. Você pode alterar todas as propriedades da coluna e encontrará a função 'mover coluna' na extremidade direita da tela.

É claro que tudo isso é apenas construir as consultas na resposta superior perfeitamente boa, mas os fãs da GUI podem apreciar a alternativa.

minha versão do phpMyAdmin é 4.1.7


1
A pergunta pergunta especificamente "Como isso pode ser feito usando as instruções ALTER". Nem todo mundo executando o MySQL usa phpMyAdmin.
Caleb

3
Eu aprendo muito do que faço hoje em dia em uma linha de comando, observando a saída da consulta de ferramentas da GUI como phpMyAdmin. Estou feliz que este post receba o número de votos negativos que as pessoas acharem mais adequado com base nisso: 1 pessoa verá isso, fará seu trabalho em um ambiente em que se sinta confortável, aprenda um pouco e siga em frente.

para esta ação, o phpmyadmi não mostra o comando que está executando a ação. Não foi encontrado
Tebe 3/16

2
Uau, tanta raiva por uma solução alternativa que faz o truque e complementa as respostas que o OP solicitou para um ALTER SQL.
Ewen

1

Eu tive que executar isso para uma coluna introduzida nos estágios posteriores de um produto, em mais de 10 tabelas. Então, escrevi esse script desarrumado e rápido para gerar o comando alter para todas as tabelas 'relevantes'.

SET @NeighboringColumn = '<YOUR COLUMN SHOULD COME AFTER THIS COLUMN>';

SELECT CONCAT("ALTER TABLE `",t.TABLE_NAME,"` CHANGE COLUMN `",COLUMN_NAME,"` 
`",COLUMN_NAME,"` ", c.DATA_TYPE, CASE WHEN c.CHARACTER_MAXIMUM_LENGTH IS NOT 
NULL THEN CONCAT("(", c.CHARACTER_MAXIMUM_LENGTH, ")") ELSE "" END ,"  AFTER 
`",@NeighboringColumn,"`;")
FROM information_schema.COLUMNS c, information_schema.TABLES t
WHERE c.TABLE_SCHEMA = '<YOUR SCHEMA NAME>'
AND c.COLUMN_NAME = '<COLUMN TO MOVE>'
AND c.TABLE_SCHEMA = t.TABLE_SCHEMA
AND c.TABLE_NAME = t.TABLE_NAME
AND t.TABLE_TYPE = 'BASE TABLE'
AND @NeighboringColumn IN (SELECT COLUMN_NAME 
    FROM information_schema.COLUMNS c2 
    WHERE c2.TABLE_NAME = t.TABLE_NAME);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.