
No MySQL isso é tarefa fácil com o uso do comando Alter Table (Change).
Propomos então o seguinte cenário:
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:
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:
Feito a alteração, vamos consultar o resultado realizando um novo select na tabela:
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.
Consultando os dados registrados:
insert into
produto (id_produto, qtd, nome)
values
(
null
,
10
,
'Produto A'
), (
null
,
20
,
'Produto B'
), (
null
,
30
,
'Produto C'
) ;
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.
No Postgres tem como fazer isso ?
ResponderExcluirSe for possível passe as instruções por favor.
Excelente artigo.
Olá "Anônimo",
ExcluirEste é 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.