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.

Foi útil?

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...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top