none
como juntar duas tabelas de dados em uma RRS feed

  • Question

  • olá pessoal, tenho varias tabelas com exatamente a mesma estrutura, e agora preciso juntar seus dados em apenas uma tabela, se eu gerar um script com Inserts, da certo funciona corretamente, o problema é que as Ids de cada tabela estão repetidos, um Id que existe em uma tabela também existe em outra, como a tabela possui uma quantidade de registros razoavelmente grande, não vou poder entrar pelo Script e alterar a Id um por um, se alguém puder me dar uma ideia de como resolver esse problema, agradeço, eu sei que UNION junta os dados de duas tabelas, já vi ser usado com Select, mas para juntar dados ainda não, será que vou ter que desenvolver uma rotina para fazer isso ? obrigado.

    Visual Studio 2010, WindowsForm, MySQL, C#

    Friday, January 24, 2014 10:21 PM

Answers

  • Porter, 

    você não precisa inserir os id's das tabelas antigas, deixa só o id identity da tabela nova

    insert into `contatos`(`dtcontato`,`horalarme`,`nomecli`) VALUES ('2014-1-10','13:00:00','JOAO')
    Att

    Wennder A. Santos

    Se foi útil, marque como útil. Se respondeu sua pergunta ou sanou sua dúvida, marque como resposta.

    • Marked as answer by Porter Porter Thursday, January 30, 2014 4:59 PM
    Wednesday, January 29, 2014 8:00 PM

All replies

  • Olá porter,

    você vai juntar todos os dados das tabelas correto?

    Tente fazer da seguinte forma, como as tabelas tem a mesma estrutura você não terá dificuldades para fazer a cópia, já o problema do id você pode resolver criando um id identity para a nova tabela e não usando como chave os id's das tabelas antigas. 

    Por exemplo:

    ID_TABELA_NOVA |  ID | ...
    
        1 				1
    
        2				2 
    
        3 				2
    
        4				1 
    
        5 				5 
    
        6				2


    Conseguiu entender? 

    Qualquer dúvida posta ae.

    Att

    Wennder A. Santos

    Se foi útil, marque como útil. Se respondeu sua pergunta ou sanou sua dúvida, marque como resposta.






    Saturday, January 25, 2014 11:34 AM
  • amigo,

    crie uma view com as 2 tabelas ou um join 

    http://pgdocptbr.sourceforge.net/pg82/sql-createview.html criando views

    http://social.msdn.microsoft.com/Forums/pt-BR/5356a208-f8e6-490d-9775-135a23b01170/fazer-inner-join-com-3-tabelas?forum=520 join com tabelas

    se a resposta for correta favor marcar como resposta 

    att,NT10K

    Saturday, January 25, 2014 1:19 PM
  • olá Wennder, o campo Id eu criei como Int e é uma chave primária, você está sugerindo que eu crie outro campo, ou altere a chave Id dessa forma ?

    ALTER TABLE CONTATOS CHANGE ID ID INT AUTO_INCREMENT PRIMARY KEY;

    No MySQL, seria AUTO_INCREMENT ao inves de INTITY, correto ?

    Saturday, January 25, 2014 1:44 PM
  • Isso mesmo Porter,

    crie um id auto_increment primary key para essa nova tabela.

    crie um campo id para receber os id's das tabelas "antigas", sendo que, esse poderá ter id's repetidos porque não será a primary key da tabela

    você não precisa alterar o campo que já criou, deixe esse campo id que você já criou como int auto_increment primary key, somente crie uma nova coluna na tabela para receber os id's das tabelas "antigas".

    Comando para criar nova coluna:

    alter table clientes add column teste int


    Tente fazer isso e de um retorno.

    Att

    Wennder A. Santos

    Se foi útil, marque como útil. Se respondeu sua pergunta ou sanou sua dúvida, marque como resposta.




    Saturday, January 25, 2014 1:58 PM
  • criei o campo com  nome teste mesmo, o id antigo não alterei, continua da mesma forma, qual é o próximo passo agora ?

    Uma dúvida na outra tabela tambem tem que criar esse campo para poder exportar os dados para a nova tabela ?

    alter table contatos add column teste int


    Saturday, January 25, 2014 2:38 PM
  • Ok,

    só para deixar claro então, esse campo "teste int" vai receber os ids das outras tabelas.

    agora para importar de uma tabela para outra use o seguinte comando:

    INSERT INTO CONTATOS
    (NOME_COLUNA1, NOME_COLUNA2, ...)
    SELECT COLUNA1, COLUNA2, ... FROM CONTATOS_ANTIGOS1;
    
    INSERT INTO CONTATOS
    (NOME_COLUNA1, NOME_COLUNA2, ...)
    SELECT COLUNA1, COLUNA2, ... FROM CONTATOS_ANTIGOS2;
    
    ...
    Tente e de um retorno.

    Att

    Wennder A. Santos

    Se foi útil, marque como útil. Se respondeu sua pergunta ou sanou sua dúvida, marque como resposta.



    Saturday, January 25, 2014 2:49 PM
  • Wennder, em cada computador, tenho uma tabela chamada contatos, então para executar esse comando que você passou, vou ter que mudar o nome da tabela origem de onde serão copiado os dados como por exemplo contatos_antigo ?

    Vou ter que renomear esse nome em cada computador, copiar essa tabela para a base e executar esse comando, seria isso ?

    obrigado.

    Saturday, January 25, 2014 4:01 PM
  • Olá porter, 

    não tem necessidade.

    Faça o seguinte, baixe um programa chamado MySql Workbech.

    Download Workbench

    É uma ferramenta visual para gerenciamento de banco de dados MySql.

    Após baixa-lo, acesse o banco de cada máquina com ele e crie um arquivo txt do tipo INSERT STATMENT das tabela que você deseja importar os dados para a nova tabela contatos.

    Como gerar esse arquivo?

    A imagem abaixo mostrá como:

    Feito isso basta executar os inserts gerado no arquivo na nova tabela. Simples e rápido.

    Se tiver dificuldades posta ae.

    Att,

    Wennder A. dos Santos

    Se minha resposta solucionou seu problema ou sua dúvida marque como Resposta ou se foi útil marque como útil. Isso ajuda outras pessoas com o mesmo problema ou dúvida.

    Saturday, January 25, 2014 4:59 PM
  • olá Wennder, consegui gerar o arquivo texto tipo insert statment pelo workbench, essa tabela eu tenho ela em 12 computadores, teria como eu gerar esse arquivo pelo MySQL Monitor atravéz de comandos ?

    Pelo workbench ficou bem facil gerar (por causa de sua explicação detalhada), mas eu vou ter que instalar o workbench em 12 maquinas para gerar esse arquivo, como eu ja tenho instalado o MySQL em todas as maquinas, se tivesse como gerar esse arquivo pelo MySQL monitor, ficaria mais fácil, encontrei alguns exemplos, mas é de Inserts normais.

    obrigado.

    Sunday, January 26, 2014 2:20 PM
  • Olá,

    vá nas máquinas que voce quer acessar o banco e libere porta 3306 no firewall do windows, verifique também se tem algum antivírus, se tiver, desabilite-o até o computador reiniciar.

    Feito isso, vá até o computador que o workbech está instalado e crie uma conexão para acessar o banco de cada máquina que deseja recuperar os dados. Pronto, agora você já consegue criar o arquivo de insert`s de todos os bancos em uma máquina só.

    Att,

    Wennder A. dos Santos

    Se minha resposta solucionou seu problema ou sua dúvida marque como Resposta ou se foi útil marque como útil. Isso ajuda outras pessoas com o mesmo problema ou dúvida.

    Sunday, January 26, 2014 5:30 PM
  • Porter,

    deu certo?

    Wennder

    Wednesday, January 29, 2014 6:00 PM
  • olá Wennder, eu tive que dar uma parada, agora eu posso retomar, é o seguinte:

    gerei esse arquivo teste.xml

    insert into `contatos`(`dtcontato`,`horalarme`,`Id`,`nomecli`) VALUES ('2014-1-10','13:00:00',1,'JOAO');

    insert into `contatos`(`dtcontato`,`horalarme`,`Id`,`nomecli`) VALUES ('2014-1-10','13:00:00',2,'CAIO');

    insert into `contatos`(`dtcontato`,`horalarme`,`Id`,`nomecli`) VALUES ('2014-1-10','13:00:00',3,'CIDA');

    insert into `contatos`(`dtcontato`,`horalarme`,`Id`,`nomecli`) VALUES ('2014-1-10','13:00:00',4,'JOSE');

    você passou esse exemplo:

    INSERT INTO CONTATOS
    (NOME_COLUNA1, NOME_COLUNA2, ...)
    SELECT COLUNA1, COLUNA2, ... FROM CONTATOS_ANTIGOS1;

    O que eu nao estou entendendo é que se eu executar o arquivo gerado (teste.sql), vai dar erro porque vai repetir os ids, a estrutura da tabela contatos está assim:

    dtcontato     Date

    horalarme     Time

    id                  Primary key

    nomecli         varchar(40)

    teste             int



    Wednesday, January 29, 2014 7:40 PM
  • Porter, 

    você não precisa inserir os id's das tabelas antigas, deixa só o id identity da tabela nova

    insert into `contatos`(`dtcontato`,`horalarme`,`nomecli`) VALUES ('2014-1-10','13:00:00','JOAO')
    Att

    Wennder A. Santos

    Se foi útil, marque como útil. Se respondeu sua pergunta ou sanou sua dúvida, marque como resposta.

    • Marked as answer by Porter Porter Thursday, January 30, 2014 4:59 PM
    Wednesday, January 29, 2014 8:00 PM
  • olá Wennder, deu certo, a coluna chamada Id era apenas uma chave primaria e eu gerava o novo codigo com o comando abaixo, mudei essa Id para auto_incremento com o comando alter table contatos modify column id int(11) auto_incremento e executei o insert into contatos(dtcontato,horalarme,nomecli) values ('2014-1-10','13:00:00','JOAO') sem o id. não vi necessidade de criar outro campo na tabela nova, apenas alterei o id para autoincremento.

    MySqlCommand sql = new MySqlCommand("select max(" + coluna + ") + 1 from " + tabela, conn);

    obrigado.

    Thursday, January 30, 2014 4:59 PM