INSERIR… NA CHAVE DUPLICADA (não faça nada)

184

Eu tenho uma tabela com uma chave exclusiva para duas colunas:

CREATE  TABLE `xpo`.`user_permanent_gift` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`fb_user_id` INT UNSIGNED NOT NULL ,
`gift_id` INT UNSIGNED NOT NULL ,
`purchase_timestamp` TIMESTAMP NULL DEFAULT now() ,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `user_gift_UNIQUE` (`fb_user_id` ASC, `gift_id` ASC) );

Quero inserir uma linha nessa tabela, mas se a chave existir, não faça nada! Não quero que um erro seja gerado porque as chaves existem.

Eu sei que existe a seguinte sintaxe:

INSERT ... ON DUPLICATE KEY UPDATE ...

mas existe algo como:

INSERT ... ON DUPLICATE KEY DO NOTHING 

?

ufk
fonte

Respostas:

332

Sim, use INSERT ... ON DUPLICATE KEY UPDATE id=id(ele não acionará a atualização de linha, embora idesteja atribuído a si mesmo).

Se você não se importa com erros (erros de conversão, erros de chave estrangeira) e exaustão do campo de incremento automático (é incrementado mesmo que a linha não seja inserida devido à chave duplicada), use INSERT IGNORE.

ceejayoz
fonte
5
apenas para adicionar IGNORE após o INSERT, o restante da sintaxe é o mesmo?
Ufk
25
@ufk: INSERT IGNOREsem a ON DUPLICATE KEYparte, por exemploINSERT IGNORE INTO xpo.user_permanent_gift (...) VALUES (...)
BoltClock
125
Observe que INSERT IGNORE também ignora outros erros, como falhas na conversão de dados.
Mjcopple
36
então eu vou usar ON DUPLICATE KEY UPDATE id = id. Eu quero apenas ignorar duplicados de chave, não qualquer outro tipo de erro.
Ufk
7
cuidado com o INSERT IGNORE incrementará a coluna de incremento automático, mesmo que a linha não seja inserida
#
9

COMO IMPLEMENTAR 'inserir se não existir'?

1 REPLACE INTO

profissionais:

  1. simples.

contras:

  1. muito devagar.

  2. a chave de incremento automático será ALTERADA (aumentada em 1) se houver entradas correspondentes unique keyou primary key, porque exclui a entrada antiga e insira uma nova.

2) INSERT IGNORE

profissionais:

  1. simples.

contras:

  1. a chave de incremento automático não será alterada se houver correspondências de entrada unique keyou se o primary keyíndice de incremento automático aumentar em 1

  2. alguns outros erros / avisos serão ignorados, como erro de conversão de dados.

3) INSERT ... ON DUPLICATE KEY UPDATE

profissionais:

  1. você pode facilmente implementar a função 'salvar ou atualizar' com este

contras:

  1. parece relativamente complexo se você apenas deseja inserir a atualização.

  2. a chave de incremento automático não será alterada se houver correspondências de entrada unique keyou se o primary keyíndice de incremento automático aumentar em 1

4. Alguma maneira de parar o aumento automático da chave se houver uma entrada correspondente unique keyou primary key?

Como mencionado no comentário abaixo por @toien: "a coluna de incremento automático será efetuada depende da innodb_autoinc_lock_modeconfiguração após a versão 5.1" se você estiver usando innodbcomo mecanismo, mas isso também afeta a simultaneidade, portanto, precisa ser bem considerado antes de ser usado. Até agora não estou vendo nenhuma solução melhor.

Kim
fonte
coluna de incremento automático será efetuada depende da innodb_autoinc_lock_modeconfiguração após a versão 5.1
toien
1

Use ON DUPLICATE KEY UPDATE ...,
Negative: porque UPDATEusa recursos para a segunda ação.

Use INSERT IGNORE ...,
Negative: O MySQL não mostrará nenhum erro se algo der errado, então você não pode lidar com os erros. Use-o apenas se você não se importa com a consulta.

Abdul Aziz Al Basyir
fonte
@abdul existe suporte ao mysql que você explicou aqui?
Lalit Tarsariya