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
?
mysql
sql
unique-key
ufk
fonte
fonte
INSERT IGNORE
sem aON DUPLICATE KEY
parte, por exemploINSERT IGNORE INTO xpo.user_permanent_gift (...) VALUES (...)
COMO IMPLEMENTAR 'inserir se não existir'?
1
REPLACE INTO
profissionais:
contras:
muito devagar.
a chave de incremento automático será ALTERADA (aumentada em 1) se houver entradas correspondentes
unique key
ouprimary key
, porque exclui a entrada antiga e insira uma nova.2)
INSERT IGNORE
profissionais:
contras:
a chave de incremento automático não será alterada se houver correspondências de entrada
unique key
ou se oprimary key
índice de incremento automático aumentar em 1alguns outros erros / avisos serão ignorados, como erro de conversão de dados.
3)
INSERT ... ON DUPLICATE KEY UPDATE
profissionais:
contras:
parece relativamente complexo se você apenas deseja inserir a atualização.
a chave de incremento automático não será alterada se houver correspondências de entrada
unique key
ou se oprimary key
índice de incremento automático aumentar em 14. Alguma maneira de parar o aumento automático da chave se houver uma entrada correspondente
unique key
ouprimary key
?Como mencionado no comentário abaixo por @toien: "a coluna de incremento automático será efetuada depende da
innodb_autoinc_lock_mode
configuração após a versão 5.1" se você estiver usandoinnodb
como 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.fonte
innodb_autoinc_lock_mode
configuração após a versão 5.1Use
ON DUPLICATE KEY UPDATE ...
,Negative: porque
UPDATE
usa 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.
fonte