Combine duas colunas de tabelas separadas
-
17-09-2020 - |
Pergunta
Digamos por exemplo:
Eu tenho duas mesas: dados_antigos e novos dados.
Ambos dados_antigos e novos dados tem uma coluna chamada isto_é_col.
Ambos dados_antigos e novos dados têm várias (centenas) de linhas de datas (06/02/2010, 09/01/2010, 02/06/2007, etc.).Ambas as tabelas não têm necessariamente as mesmas datas, mas ambas têm o mesmo formato.
Os campos de ambas as tabelas são vários números inteiros.
Minha tarefa:
Copie os campos de dados_antigos para novos dados.
Se existir uma data em ambas as tabelas, o campo em novos dados será substituído.
Se a data não existir em novos dados, a linha correta será adicionada e o campo será copiado.
Aqui está o quão longe eu cheguei:
Crie uma coluna temporária:
ALTER TABLE `new_data` ADD `tempColumn` TEXT NULL;
Copie os dados de dados_antigos:
INSERT INTO `new_data` (`tempColumn`) SELECT `this_is_col` FROM `old_data`;
Combine coluna temporária e novos dados . isto_é_col.(Eu realmente não descobri esse passo, pois não cheguei tão longe).
MERGE? `tempColumn` `this_is_col`;
Excluir tabela temporária
ALTER TABLE `new_data` DROP `tempColumn`;
Ao realizar a segunda ação (transferir os dados para a coluna temporária), recebo este erro:
#1062 - Duplicate entry '0000-00-00' for key 1
E agora estou preso.Qualquer ajuda seria apreciada.Estou usando MySQL e phpMyAdmin para testar os comandos SQL.
Solução
Supondo que suas datas sejam indexadas como chaves exclusivas:
INSERT INTO newtable
SELECT *
FROM oldtable
ON DUPLICATE KEY column1=oldcolumn1, ...
Outras dicas
você quer INSERIR ...NA ATUALIZAÇÃO DE CHAVE DUPLICADA.sua solução já satisfaz as etapas 1 e 3 da sua tarefa, ON DUPLICATE KEY UPDATE cuidará da etapa 2.
Se você preferir excluir a linha primeiro, em vez de atualizar: SUBSTITUIR
Seria apenas uma linha também, então:REPLACE data SELECT, você não teria que fazer a estranheza de adicionar uma coluna de texto.
Que tal apenas fazer um UPDATE
e INSERT
?
UPDATE new_data SET col=col
FROM new_data a join old_data b on a.this_is_col = b.this_is_col
Então
INSERT INTO new_data (cols) SELECT cols
FROM old_data WHERE this_is_col NOT IN (SELECT this_is_col FROM new_data)
A menos que eu tenha entendido mal...