segunda-feira, 6 de agosto de 2012

Criando uma tabela com base em outra já existente

logotipo do MySQL
Salve salve colegas.

Começo este post lhe questionando:

De que forma eu posso duplicar uma tabela, estrutura e dados?

Sei que devem haver várias formas e, hoje vou apresentar aos colegas duas, uma que copia estrutura e dados e outra somente a estrutura.

O primeiro exemplo será para uma criação de uma nova tabela, duplicando a estrutura e dados.

1º - Digamos que preciso duplicar minha tabela aniversariantes, que possui a seguinte estrutura:
Show Create Table paposql.aniversariantes 
 CREATE TABLE `aniversariantes` (  
  `id_aniversariante` bigint(20) DEFAULT NULL,  
  `nome` varchar(50) DEFAULT NULL,  
  `dt_nascimento` date DEFAULT NULL,  
  KEY `idx_dt_nascimento` (`dt_nascimento`)  
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8  

2º - Na tabela, possuímos os dados:
Select * From paposql.aniversariantes 
 1     Aniversariante 1     2012-01-01  
 2     Aniversariante 2     2012-02-01  
 3     Aniversariante 3     2012-03-01  
 5     Aniversariante 5     2012-05-01  
 6     Aniversariante 6     2012-06-01  
 7     Aniversariante 7     2012-07-01  
 8     Aniversariante 8     2012-08-01  
 9     Aniversariante 9     2012-09-01  
 10     Aniversariante 10     2012-10-01  
 11     Aniversariante 11     2012-11-01  
 12     Aniversariante 12     2012-12-01  

3º - Voltando ao início do post, como fazer duplicar esta tabela? Simples, vejamos:
 Create Table paposql.aniversariantes_copia  
 Select * From paposql.aniversariantes  


4º - Pronto, minha tabela aniversariantes foi duplicada com sucesso, vejamos a estrura:
 CREATE TABLE `aniversariantes_copia` (  
  `id_aniversariante` bigint(20) DEFAULT NULL,  
  `nome` varchar(50) DEFAULT NULL  
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8  

5º - Os dados:
Select * From paposql.aniversariantes_copia 
 1     Aniversariante 1     2012-01-01  
 2     Aniversariante 2     2012-02-01  
 3     Aniversariante 3     2012-03-01  
 5     Aniversariante 5     2012-05-01  
 6     Aniversariante 6     2012-06-01  
 7     Aniversariante 7     2012-07-01  
 8     Aniversariante 8     2012-08-01  
 9     Aniversariante 9     2012-09-01  
 10     Aniversariante 10     2012-10-01  
 11     Aniversariante 11     2012-11-01  
 12     Aniversariante 12     2012-12-01  


Na instrução uso normalmente o comando Create Table, onde especifico que as colunas deverão ser baseados na tabela aniversariantes já existe, mas, caso eu queria duplicar com apenas os campos id_aniversariante e nome eu também posso fazer a seguinte instrução:
 Create Table paposql.aniversariantes_copia  
 Select id_aniversariante, nome From paposql.aniversariantes  

Feito, realizamos a duplicação da tabela de forma rápida e fácil, mas, você deve ter observado que tivemos um pequeno probleminha nesta operação, certo?

Quando criamos a tabela aniversariantes_copia podemos ver que o índice existente na tabela original não foi criado, para isto vamos agora aprender a utilizar a segunda forma de duplicação citada no início do post.

6º - Novamente vamos ver a estrutura da tabela aniversariantes:
Show Create Table paposql.aniversariantes_copia2  
 CREATE TABLE `aniversariantes` (  
  `id_aniversariante` bigint(20) DEFAULT NULL,  
  `nome` varchar(50) DEFAULT NULL,  
  `dt_nascimento` date DEFAULT NULL,  
  KEY `idx_dt_nascimento` (`dt_nascimento`)  
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8  

7º - Agora vamos duplicar novamente a tabela só que desta vez somente a estrutura, e completa:
 Create Table paposql.aniversariantes_copia2   
    Like paposql.aniversariantes  

Feito, estrutura duplicada, vamos checar o resultado?
Show Create Table paposql.aniversariantes_copia2 
 CREATE TABLE `aniversariantes_copia2` (  
  `id_aniversariante` bigint(20) DEFAULT NULL,  
  `nome` varchar(50) DEFAULT NULL,  
  `dt_nascimento` date DEFAULT NULL,  
  KEY `idx_dt_nascimento` (`dt_nascimento`)  
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8  

Alerto aos colegas somente sobre a necessidade de renomear o índice, evitando assim a existência de um índice duplicado.

Bom pessoal, espero que as dicas tenham sido mais uma vez úteis e, sugestões, críticas ou elogios serão bem vindos.

Grande abraço.

Clique aqui e veja todas as matérias sobre MySQL

2 comentários:

  1. Este comentário foi removido pelo autor.

    ResponderExcluir
    Respostas
    1. Olá Roger, na versão do MySQL que estou usando (5.1 e 5.5), com ou sem o alias funcionou, qual a versão que esta usando? Deu algum erro?

      Abraços e obrigado pelo feedback.

      Excluir