Eu digo que você não faz isso, por dois motivos:
- as mensagens de erro não estão claras:ERROR 1062 (23000):Duplicate entry 'xxx' for key 1 . Você sempre tem 100% de certeza de qual chave é 1?
- ele prende você a um fornecedor de banco de dados específico
Acho mais simples fazer transacionalmente :
- verificar a existência da linha;
- lançar uma exceção se a linha já existir;
- insira a nova linha.
Problemas de desempenho :
Eu digo meça duas vezes, corte uma vez . Crie um perfil de uso para seu caso de uso específico. No topo da minha cabeça, eu diria que o desempenho não será um problema, exceto para os cenários de uso pesado de db.
A razão é que uma vez que você executa um
SELECT
sobre essa linha específica, seus dados serão colocados nos caches do banco de dados e imediatamente usado para verificação de inserção feita no índice para o INSERT
declaração. Também tendo em mente que este acesso é apoiado por um índice leva à conclusão de que o desempenho não será um problema. Mas, como sempre, meça.