Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como posso fazer 'inserir se não existir' no MySQL?


Use INSERT IGNORE INTO table .

Há também INSERT … ON DUPLICATE KEY UPDATE sintaxe, e você pode encontrar explicações em 13.2.6.2 INSERT ... ON DUPLICATE KEY UPDATE Declaração .

Post de bogdan.org.ua de acordo com webcache do Google :

18 de outubro de 2007

Para começar:a partir do MySQL mais recente, a sintaxe apresentada no título não é possível. Mas existem várias maneiras muito fáceis de realizar o que é esperado usando a funcionalidade existente.

Existem 3 soluções possíveis:usando INSERT IGNORE, REPLACE ou INSERT … ON DUPLICATE KEY UPDATE.

Imagine que temos uma tabela:
CREATE TABLE `transcripts` (
`ensembl_transcript_id` varchar(20) NOT NULL,
`transcript_chrom_start` int(10) unsigned NOT NULL,
`transcript_chrom_end` int(10) unsigned NOT NULL,
PRIMARY KEY (`ensembl_transcript_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Agora imagine que temos um pipeline automático importando metadados de transcrições do Ensembl e que, por vários motivos, o pipeline pode ser quebrado em qualquer etapa da execução. Assim, precisamos garantir duas coisas:
  1. execuções repetidas do pipeline não destruirão nosso> banco de dados
  1. execuções repetidas não serão interrompidas devido a erros de 'duplicação> de chave primária'.

Método 1:usando REPLACE

É muito simples:
REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;

Se o registro existir, ele será sobrescrito; se ainda não existir, será criado. No entanto, usar este método não é eficiente para o nosso caso:não precisamos sobrescrever os registros existentes, é bom apenas ignorá-los.

Método 2:usando INSERT IGNORE Também muito simples:
INSERT IGNORE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;

Aqui, se o ‘ensembl_transcript_id’ já estiver presente no banco de dados, ele será ignorado silenciosamente (ignorado). (Para ser mais preciso, aqui está uma citação do manual de referência do MySQL:“Se você usar a palavra-chave IGNORE, os erros que ocorrem durante a execução da instrução INSERT são tratados como avisos. Por exemplo, sem IGNORE, uma linha que duplica um índice UNIQUE existente ou PRIMARY KEY valor na tabela causa um erro de chave duplicada e a instrução é abortada.”.) Se o registro ainda não existir, ele será criado.

Este segundo método tem vários pontos fracos em potencial, incluindo o não aborto da consulta caso ocorra algum outro problema (consulte o manual). Portanto, deve ser usado se testado anteriormente sem a palavra-chave IGNORE.

Método 3:usando INSERT … ON DUPLICATE KEY UPDATE:

A terceira opção é usar INSERT … ON DUPLICATE KEY UPDATE sintaxe, e na parte UPDATE não faça nada, faça alguma operação sem sentido (vazia), como calcular 0+0 (Geoffray sugere fazer a atribuição id=id para o mecanismo de otimização MySQL ignorar esta operação). A vantagem desse método é que ele apenas ignora eventos de chave duplicada e ainda aborta em outros erros.

Como aviso final:este post foi inspirado no Xaprb. Eu também aconselho a consultar seu outro post sobre como escrever consultas SQL flexíveis.