sql >> Databasteknik >  >> RDS >> Mysql

Hur kan jag göra 'insert if not exists' i MySQL?

Använd INSERT IGNORE INTO table .

Det finns också INSERT … ON DUPLICATE KEY UPDATE syntax, och du kan hitta förklaringar i 13.2.6.2 INFOGA ... PÅ DUBLIKAT UPPDATERING AV NYCKEL .

Inlägg från bogdan.org.ua enligt Googles webbcache :

18 oktober 2007

För att börja:från och med den senaste MySQL är syntax som presenteras i titeln inte möjlig. Men det finns flera mycket enkla sätt att åstadkomma det som förväntas med hjälp av befintlig funktionalitet.

Det finns tre möjliga lösningar:använda INSERT IGNORE, REPLACE, or INSERT … PÅ DUBLIKAT UPPDATERING AV NYCKEL.

Föreställ dig att vi har ett bord:

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;

Föreställ dig nu att vi har en automatisk pipeline som importerar transcriptsmeta-data från Ensembl, och att pipelinen på grund av olika anledningar kan brytas i vilket steg som helst av exekvering. Därför måste vi säkerställa två saker:

  1. upprepade körningar av pipelinen kommer inte att förstöra vår> databas
  1. upprepade körningar kommer inte att dö på grund av "duplicera> primärnyckel"-fel.

Metod 1:med REPLACE

Det är väldigt enkelt:

REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;

Om posten finns kommer den att skrivas över; om det inte finns ännu kommer det att skapas. Att använda den här metoden är dock inte effektivt för vårt fall:vi behöver inte skriva över befintliga poster, det är helt enkelt att hoppa över dem.

Metod 2:använda INSERT IGNORE Också mycket enkel:

INSERT IGNORE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;

Här, om 'ensembl_transcript_id' redan finns i databasen, kommer det att hoppa över (ignoreras) tyst. (För att vara mer exakt, här är ett citat från MySQL referensmanual:"Om du använder IGNOREkeyword behandlas fel som uppstår när INSERT-satsen körs som varningar istället. Till exempel utan IGNORE, en rad som duplicerar ett befintligt UNIKT index eller PRIMÄRNYCKEL värde i tabellen orsakar ett duplicate-key fel och satsen avbryts.”.) Om posten inte finns ännu kommer den att skapas.

Denna andra metod har flera potentiella svagheter, inklusive att inte avbryta frågan om något annat problem uppstår (se manualen). Därför bör den användas om den tidigare testats utan nyckelordet IGNORE.

Metod 3:med INSERT … PÅ DUPLIKATNYCKELUPPDATERING:

Det tredje alternativet är att använda INSERT … ON DUPLICATE KEY UPDATE syntax, och i UPDATE-delen gör bara ingenting, gör någon meningslös (tom) operation, som att beräkna 0+0 (Geoffray föreslår att du gör tilldelningen theid=id för att MySQL-optimeringsmotorn ska ignorera denna operation). Fördelen med denna metod är att den bara ignorerar duplicatekey-händelser och fortfarande avbryter vid andra fel.

Som en sista notis:det här inlägget är inspirerat av Xaprb. Jag skulle också råda dig att konsultera hans andra inlägg om hur du skriver flexibla SQL-frågor.



  1. Oracle-tabell dynamisk partition

  2. proxysql-admin Alternativ - ClusterControl ProxySQL GUI

  3. Hur man hanterar användare och autentisering i MySQL

  4. Exportera Postgresql-tabelldata med pgAdmin