Usuário com melhor resposta
Migrar dados para uma tabela nova.

Pergunta
-
Boa tarde Galera,
Preciso de uma ajuda:
Hoje duas de minhas tabelas do Banco de Dados já está saturado, o que foi indicado para mim é desmembrar essas tabelas, pois queria que os dados fossem migrado para uma nova tabela que irei criar. Hoje simulei com uma tabela nova e outra tabela (esta aonde os dados antigos estão armazenados), ocorreu tudo no conforme!, como faço para a nova tabela receber os (dados da segunda tabela antiga) ?
O que eu já fiz hoje foi:
- Hoje fiz em um script diferente (INSERT INTO TABELA_NOVA) (SELECT * FROM TABELA_ANTIGA), coloquei separadamente e os dois apresentaram erros.
- Eu fiz no mesmo SCRIPT (INSERT INTO TABELA_NOVA) (SELECT * FROM TABELA_ANTIGA1) e (INSERT INTO TABELA_NOVA) (SELECT * FROM TABELA_ANTIGA2), pois eu deduzi que os mesmo dados iam para a mesma tabela nova, mas também não ia ocorreu conforme o solicitado,
- A primeira tabela foi tudo normalmente, pois não há chave estrangeira, mas a segunda há pelo menos 4 chaves estrangeira).
Respostas
-
Milton,
O teu problema é que você não pode fazer um UNION da forma que está fazendo...
O que você está fazendo você teria como resultado algo como
Dado1Coluna1TabelaAntiga1 Dado1Coluna2TabelaAntiga1
Dado2Coluna1TabelaAntiga1 Dado2Coluna2TabelaAntiga1
Dado3Coluna1TabelaAntiga1 Dado3Coluna2TabelaAntiga1
Dado1Coluna1TabelaAntiga2 Dado1Coluna2TabelaAntiga2
Dado2Coluna1TabelaAntiga2 Dado2Coluna2TabelaAntiga2
Dado3Coluna1TabelaAntiga2 Dado3Coluna2TabelaAntiga2
Se é isso o que deseja, crie a tabela nova com apenas duas colunas.
Agora, para que a tabela tenha as 4 colunas, você deve fazer um join entre as duas tabelas antigas.
Algo como
SELECT TB1.COLUNA1, TB1.COLUNA2, TB2.COLUNA1, TB2.COLUNA2 FROM TabelaAntiga1 TB1 JOIN TabelaAntiga2 TB2 ON TB1.PK = TB2.PK_TB1
Espero que te ajude.
[]'s!
/* Logan Destefani Merazzi - DBA | @LoganMerazzi | http://www.merazzi.eti.br
Se a resposta for útil, vote nela. Se resolveu, marque-a como resposta. */- Marcado como Resposta Milton Honji terça-feira, 24 de novembro de 2015 17:05
-
Boa tarde Logan,
Muito obrigado pela dica, mas o problema foi do banco poderia haver mais de um registro, mesmo assim já pode marcar como resposta.
Milton Honji.
- Marcado como Resposta Milton Honji terça-feira, 24 de novembro de 2015 17:04
Todas as Respostas
-
Milton boa tarde
exatamente vai ter que realizar esse script
insert into Tabela_nova values (select Campos from Tabela_Antiga)
mas confere os campos se estão ok, e as chaves estrangeiras se suas respectivas tabelas estiverem preenchidas correto não vai dar problema.
Abraço
Espero ter ajudado.
- Editado Danilo Telles terça-feira, 17 de novembro de 2015 16:28
-
Boa tarde,
Milton, não sei se entendi corretamente mas experimente dessa forma:
INSERT INTO TABELA_NOVA SELECT * FROM TABELA_ANTIGA1 UNION ALL SELECT * FROM TABELA_ANTIGA2;
Espero que ajude.
Assinatura: http://www.imoveisemexposicao.com.br
-
Boa tarde,
Milton tenho um amigo que compartilhou um script que identifica, drop e recria as Fks.
segue o link
Se a resposta foi útil por favor classifique. Tiago Neves - @tiagolneves - acesse o meu blog http://www.tiagoneves.net
-
Milton,
A princípio acredito que o uso do Insert...Select, quais seriam os erros que você esta recebendo?
Você se referiu a existência de relacionamento na Tabela2, neste caso, o mais indicado é você migrar tudo o que não possui relacionamento, posteriormente migrar esta Tabela2 mas ter certeza que os dados não estarão infrigindo qualquer regra de integridade referencial.
Por padrão em qualquer processo de importação ou migração os relacionamentos, índices ou qualquer outra tipo de constraints deve ser removido para evitar problemas de performance caso o volume de dados que você esteja trabalhando seja muito grande.
Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
-
Você pode explicar o que não deu certo? Foi exibida alguma mensagem de erro? Se foi, qual?
Assinatura: http://www.imoveisemexposicao.com.br
-
Gapimex,
Apareceu esta mensagem, mas muito obrigado pela sugestão.
Server: Msg 120, Level 15, State 1, Line 101
The select list for the INSERT statement contains fewer items than the insert list. The number of SELECT values must match the number of INSERT columns. -
Pela mensagem de erro a tabela nova possui uma quantidade de colunas maior que as tabelas antigas.
Nesse caso acredito que uma alternativa seria especificar a lista de colunas onde serão inseridos os valores, sendo que as demais colunas ficariam nulas. Ex:
INSERT INTO TABELA_NOVA (Id, Nome, CPF) SELECT Id, Nome, CPF FROM TABELA_ANTIGA1 UNION ALL SELECT Id, Nome, CPF FROM TABELA_ANTIGA2;
Outra alternativa seria colocar valores fixos para as novas colunas no Select, sendo possível colocar inclusive null. Ex:
INSERT INTO TABELA_NOVA (Id, Nome, CPF, ColunaNova1, ColunaNova2) SELECT Id, Nome, CPF, null, 'A' FROM TABELA_ANTIGA1 UNION ALL SELECT Id, Nome, CPF, null, 'B' FROM TABELA_ANTIGA2;
Espero que ajude.
Assinatura: http://www.imoveisemexposicao.com.br
-
Bom dia,
Hoje refiz a tabela novamente com apenas com os campos que terão os registros migrado para esta tabela nova e também declarei as chaves estrangeiras na tabela, mas mesmo assim não estou conseguindo mesmo com o procedimento do SELECT e o UNION, fiz do mesmo jeito e o erro aparece o mesmo.
-
Bom dia,
Se for migração dos dados para um tabela nova e sem informações cadastradas, primeiro crie a tabela com o select into e depois gere os scripts de criação das chaves, trigger, fk e pk.
Me add no skype que te ajudo: contato.fabiocerqueira
Atenciosamente, Fábio Cerqueira Analista de Suporte Skype: contato.fabiocerqueira Cel: 71 9986.9295 Site: www.fabiocerqueira.com
-
Bom dia,
Milton, você pode postar o comando que você tentou executar?
Assinatura: http://www.imoveisemexposicao.com.br
-
-
Outra opção seria criar uma tabela particionada com a mesma estrutura e migrar os dados, assim não precisaria trabalhar com desmembramento.
- Editado André Renato Furtado quarta-feira, 18 de novembro de 2015 16:07
-
-
Boa tarde,
Infelizmente, por politica da empresa não posso disponibilizar o código.
mas fiz assim
INSERT INTO TABELA NOVA
(
COLUNA1_mesmo_nome_tabela_ant_1,
COLUNA2_mesmo_nome_tabela_ant_1,
COLUNA1_mesmo_nome_tabela_ant_2,
COLUNA2_mesmo_nome_tabela_ant_2,
)
SELECT
COLUNA1
COLUNA2
)
FROM TABELA_ANTIGA_1
UNION ALL
SELECT
(
COLUNA1,
COLUNA2
)
FROM TABELA_ANTIGA_2
Tinha Esquecido de falar utilizo o SQL 2000.
Pensei em uma hipótese sobre colocar a chave estrangeira, após criar as tabelas, antes de colocar todos os registros.Será que isso é uma boa ideia?
- Marcado como Resposta Milton Honji terça-feira, 24 de novembro de 2015 17:05
- Não Marcado como Resposta Milton Honji terça-feira, 24 de novembro de 2015 17:05
-
Milton,
O teu problema é que você não pode fazer um UNION da forma que está fazendo...
O que você está fazendo você teria como resultado algo como
Dado1Coluna1TabelaAntiga1 Dado1Coluna2TabelaAntiga1
Dado2Coluna1TabelaAntiga1 Dado2Coluna2TabelaAntiga1
Dado3Coluna1TabelaAntiga1 Dado3Coluna2TabelaAntiga1
Dado1Coluna1TabelaAntiga2 Dado1Coluna2TabelaAntiga2
Dado2Coluna1TabelaAntiga2 Dado2Coluna2TabelaAntiga2
Dado3Coluna1TabelaAntiga2 Dado3Coluna2TabelaAntiga2
Se é isso o que deseja, crie a tabela nova com apenas duas colunas.
Agora, para que a tabela tenha as 4 colunas, você deve fazer um join entre as duas tabelas antigas.
Algo como
SELECT TB1.COLUNA1, TB1.COLUNA2, TB2.COLUNA1, TB2.COLUNA2 FROM TabelaAntiga1 TB1 JOIN TabelaAntiga2 TB2 ON TB1.PK = TB2.PK_TB1
Espero que te ajude.
[]'s!
/* Logan Destefani Merazzi - DBA | @LoganMerazzi | http://www.merazzi.eti.br
Se a resposta for útil, vote nela. Se resolveu, marque-a como resposta. */- Marcado como Resposta Milton Honji terça-feira, 24 de novembro de 2015 17:05
-
Você pode reconstruir o Id das tabelas antigas, e inserir uma nova numeração, evitando assim o erro de chaves estrangeiras, ou pode usar o Import Export do próprio SQL SERVER.
- Editado Poliana Dias quarta-feira, 18 de novembro de 2015 19:18
- Sugerido como Resposta Marcos SJ sexta-feira, 20 de novembro de 2015 11:39
-
Boa tarde Logan,
Muito obrigado pela dica, mas o problema foi do banco poderia haver mais de um registro, mesmo assim já pode marcar como resposta.
Milton Honji.
- Marcado como Resposta Milton Honji terça-feira, 24 de novembro de 2015 17:04
-
Você pode reconstruir o Id das tabelas antigas, e inserir uma nova numeração, evitando assim o erro de chaves estrangeiras, ou pode usar o Import Export do próprio SQL SERVER.
Poliana,
Com base, neste resposta do Logan, me veio a cabeça da possibilidade de você criar uma nova tabela fazendo uso do Identity diretamente no comando de Select Into.
Veja este exemplo:
-- Utilizando - Função - Identity no Select Into -- select identity(int, 1,1) As Seq, name into #teste from sys.sysdatabases
Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
- Sugerido como Resposta André Renato Furtado domingo, 29 de novembro de 2015 11:49