Duplicar e ignorar em inserções do MySQL

As chaves primárias e os índices exclusivos da tabela MySQL evitam 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, encontrará um erro e a inserção falhará.

O MySQL fornece várias alternativas para a instrução INSERT padrão e cada uma lida com linhas duplicadas de maneira ligeiramente diferente: "INSERT IGNORE," "INSERT ... ON DUPLICATE KEY UPDATE" e "REPLACE."

Chaves primárias e índices únicos

Índices de chave primária e restrições de índice "UNIQUE" requerem que cada linha contenha um valor único na (s) coluna (s) do índice, permitindo que cada linha seja identificada por sua chave primária ou o valor na (s) coluna (s) de restrição de índice UNIQUE.

Se um INSERT normal tentar inserir uma linha que contém um valor duplicado na chave primária ou índice de restrição UNIQUE, a inserção falhará, possivelmente revertendo toda a transação.

INSERIR IGNORAR

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) VALUES (1, 'outro valor');

INSERT ... ON DUPLICATE KEY UPDATE

INSERT ... ON DUPLICATE KEY UPDATE irá inserir quaisquer linhas não duplicadas normalmente. No entanto, ao encontrar uma linha duplicada, ele executará um UPDATE na linha original; por exemplo:

INSERT INTO my_table (unique_index_column, other_column) VALUES (1, 'outro valor') ON DUPLICATE KEY UPDATE other_column = 'duplicate update value';

SUBSTITUIR

REPLACE funciona da mesma forma que INSERT, exceto que quando encontra uma linha duplicada, ele exclui a linha original e então 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')