segunda-feira, 3 de junho de 2013

Reordenando campos em tabela no MySQL

As tabelas de um modo geral seguem uma ordem lógica quando falamos de seus atributos (campos), por exemplo, em uma tabela de produtos é comum termos o atributo qtd após o nome. Mas nem sempre nos deparamos com estruturas assim, e ai, como alterar a estrutura de forma fácil, e o mais importante, sem perder os dados ali já registrados?

No MySQL isso é tarefa fácil com o uso do comando Alter Table (Change). 

Propomos então o seguinte cenário:

Tabela: produto:

 create table produto(   
  id_produto bigint not null auto_increment,  
  qtd int not null default 0,  
  nome varchar(50),  
  primary key (id_produto)  
 );  

Inserindo registros:

 insert into produto (id_produto, qtd, nome)  
 values  
  (null, 10, 'Produto A'),  
  (null, 20, 'Produto B'),  
  (null, 30, 'Produto C') ;  
Consultando os dados registrados:

 select  *  
 from produto ;  

id_produto  qtd     nome    
----------  ------  -----------
1           10      Produto A
2           20      Produto B
3           30      Produto C

Vamos alterar a posição do atributo qtd, deixando-o após o nome:

 alter table produto  
  change column nome nome varchar (50) null default null after id_produto ;  

Feito a alteração, vamos consultar o resultado realizando um novo select na tabela:

 select  *  
 from produto ;  

id_produto  nome       qtd  
----------  ---------  --------
1           Produto A  10    
2           Produto B  20    
3           Produto C  30    

Veja que nosso objetivo foi alcançado com sucesso, o campo esta na posição desejada e, os dados permanecem da mesma forma antes da alteração.

Explicando um ponto que pode deixar dúvidas é, o motivo do campo nome ter sido especificado duas vezes é devido ao fato da sintaxe ser:

CHANGE [COLUMN] old_col_name new_col_name

Traduzindo, o nome do campo antigo (atual) e nome do novo campo, caso seja necessário renomeá-lo.

Agora, como toda alteração gera impactos direta ou indiretamente, alerto quanto a importância de verificar a necessidade de replicar essa mudança na camada aplicação.

Por mais útil e fácil que seja a alteração, ela  não é vista como necessária por muitos DBA`s, pois, a ordem dos atributos podem ser manipulada facilmente através de select, eu particularmente prefiro a mudança de estrutura, e você?

Um grande abraço e até a próxima.

2 comentários:

  1. No Postgres tem como fazer isso ?
    Se for possível passe as instruções por favor.
    Excelente artigo.

    ResponderExcluir
    Respostas
    1. Olá "Anônimo",

      Este é um assunto que já foi alvo de algumas discussões pela web, te adiantando, não é possível realizar no PostgreSQL a mesma ação que exemplifiquei neste artigo, a alternativa é:

      "Se ainda não estiver satisfeito pois quer suas tabelas "bonitinhas" e organizadas:
      1. CREATE TABLE novo_nome AS SELECT id,cpf,nome FROM sua_tabela;
      2. DROP TABLE sua_tabela;
      3. ALTER TABLE novo_nome RENAME TO sua_tabela;
      Osvaldo (Na lista PostgreSQL-Brasil)."

      Veja mais sobre o assunto em:

      http://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/Ap%C3%AAndices/Dicas_Pr%C3%A1ticas_de_uso_do_SQL

      http://wiki.postgresql.org/wiki/Alter_column_position

      Espero ter ajudado, grande abraço.

      Excluir