Um pouco sobre ETL e SGBDs
No processo de ETL existem algumas necessidades contínuas de validação para que dados já inseridos não sejam duplicados, para que dados que precisam ser atualizados possam ser modificados caso tenham sido alterados, e para que somente dados novos, não existentes anteriormente, possam ser inseridos numa estrutura que representa o target dentro de uma arquitetura de ETL.
Levando isso em consideração, muitas ferramentas no mercado passam a se responsabilizar pelo trabalho de comparação do estado atual com os dados que foram extraídos e transformados e que precisam ser validados antes de serem carregados. No entanto, considerando que os principais SGBDs de mercado possuem funcionalidades avançadas que são desconhecidas por muitos e, por isso, pouco utilizadas, vale a pena refletir sobre como eles realizam essa validação de forma inteligente, sem a dependência de ferramentas adicionais ou da construção de scripts para realizar essa validação, o que só aumenta a complexidade e até mesmo os tempos de processamento, de acordo com cada implementação, para realização desse processo.
No MySQL, a instrução INSERT ... ON DUPLICATE KEY UPDATE permite inserir novos registros em uma tabela e, se a inserção falhar devido a uma violação de chave primária ou chave única, ela atualiza o registro existente com as novas informações de acordo com a chave identificada. Existem alguns pré-requisitos para que essa funcionalidade possa ser executada de maneira adequada. Fica claro que o pré-requisito de que a tabela precisa ter uma chave primária ou uma restrição de chave única em uma ou mais colunas é obrigatório. É isso que permite que o MySQL, e na verdade qualquer SGBD que implemente uma função similar, faça essa verificação dos registros.
Garantir a autorização de registros sem necessidade de operações separadas é possível por meio desta abordagem. Isso é especialmente valioso quando estamos falando de eventos com muitas operações de inserção e atualização, pois a quantidade de código necessária é reduzida e, consequentemente, a possibilidade de erros pela depreciação de pontos no fluxo de processo de execução também.
Gostei de sua abordagem e gostaria que se pussivel pudesse trazer exemplos praticos para melhor visualização. Obrigado por existir.
Nunca usei este recuso no MySQL, mas eu uso o Google BigQuery, e nele o recurso se chama MERGE, onde voce faz exatamente isso com umas coisinhas a mais. Muito prático.