Duplicar e Ignorar em Inserções MySQL
Chaves primárias da tabela MySQL e índices exclusivos impedem que várias linhas com o mesmo índice sejam adicionadas à tabela. Se você tentar inserir uma linha duplicada com uma instrução INSERT padrão, você encontrará um erro e a inserção falhará.
O MySQL fornece várias alternativas para a instrução INSERT padrão e cada um manipula linhas duplicadas de forma ligeiramente diferente: "INSERT IGNORE", "INSERT ... ON DUPLICATE KEY UPDATE" e "REPLACE."
Chaves primárias e índices exclusivos
Índices de chave primária e restrições de índice "UNIQUE" exigem que cada linha contenha um valor único na (s) coluna (s) de índice, permitindo que cada linha seja identificada por sua chave primária ou pelo valor na (s) coluna (s) de restrição de índice UNIQUE.
Se um INSERT normal tentar inserir uma linha que contenha um valor duplicado na chave primária ou no índice de restrição UNIQUE, a inserção falhará, possivelmente revertendo toda a transação.
INSERIR IGNORE
INSERT IGNORE irá inserir linhas da mesma forma que INSERT, mas com a exceção de que irá ignorar linhas com valores duplicados e continuar a execução sem criar um erro. Qualquer linha que contenha um valor duplicado não será inserida; por exemplo:
INSERT IGNORE INTO my_table (unique_index_column, other_column) VALORES (1, 'outro valor');
INSERT ... ON DUPLICATE KEY UPDATE
INSERT ... ON DUPLICATE KEY UPDATE irá inserir qualquer linha não duplicada como normal. No entanto, quando encontrar uma linha duplicada, executará um UPDATE na linha original; por exemplo:
INSERT INTO my_table (unique_index_column, other_column) VALORES (1, 'outro valor') ON DUPLICATE KEY UPDATE other_column = 'valor de atualização duplicado';
SUBSTITUIR
REPLACE funciona da mesma forma que INSERT, exceto que quando encontra uma linha duplicada, apaga a linha original e continua com a inserção. Qualquer linha com um valor de índice exclusivo duplicado substituirá a linha que originalmente continha o valor; por exemplo:
REPLACE INTO my_table (unique_index_column, other_column) VALUES (1, 'outro valor')