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 

?

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.


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.


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 existe suporte ao mysql que você explicou aqui?
— Lalit Tarsariya
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.