sql >> Database >  >> RDS >> Mysql

Hoe kan ik 'invoegen indien niet bestaat' in MySQL doen?

Gebruik INSERT IGNORE INTO table .

Er is ook INSERT … ON DUPLICATE KEY UPDATE syntaxis, en u kunt uitleg vinden in 13.2.6.2 INSERT ... ON DUPLICATE KEY UPDATE Verklaring .

Post van bogdan.org.ua volgens Webcache van Google :

18 oktober 2007

Om te beginnen:vanaf de laatste MySQL is de syntaxis in de titel niet mogelijk. Maar er zijn verschillende zeer eenvoudige manieren om te bereiken wat verwacht wordt met behulp van bestaande functionaliteit.

Er zijn 3 mogelijke oplossingen:INSERT IGNORE, REPLACE ofINSERT gebruiken ... ON DUPLICATE KEY UPDATE.

Stel je voor dat we een tafel hebben:

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;

Stel je nu voor dat we een automatische pijplijn hebben die transcriptsmeta-gegevens van Ensembl importeert, en dat om verschillende redenen de pijplijn bij elke stap van uitvoering kan worden verbroken. We moeten dus voor twee dingen zorgen:

  1. herhaalde uitvoeringen van de pijplijn zullen onze> database niet vernietigen
  1. Herhaalde uitvoeringen gaan niet dood door 'duplicaat> primaire sleutel'-fouten.

Methode 1:gebruik VERVANGEN

Het is heel eenvoudig:

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

Als het record bestaat, wordt het overschreven; als het nog niet bestaat, wordt het gemaakt. Het gebruik van deze methode is in ons geval echter niet efficiënt:we hoeven bestaande records niet te overschrijven, het is prima om ze gewoon over te slaan.

Methode 2:INSERT IGNORE gebruiken Ook heel eenvoudig:

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

Hier, als de 'ensembl_transcript_id' al aanwezig is in de database, wordt deze stil overgeslagen (genegeerd). (Om preciezer te zijn, hier is een citaat uit de MySQL-referentiehandleiding:"Als u het IGNORE-trefwoord gebruikt, worden fouten die optreden tijdens het uitvoeren van de INSERT-instructie in plaats daarvan behandeld als waarschuwingen. Bijvoorbeeld, zonder IGNORE, een rij die een bestaande UNIEKE index of PRIMARY KEY dupliceert waarde in de tabel veroorzaakt een dubbele sleutelfout en de instructie wordt afgebroken.”.) Als het record nog niet bestaat, wordt het aangemaakt.

Deze tweede methode heeft verschillende potentiële zwakheden, waaronder het niet-aborteren van de zoekopdracht in het geval er zich een ander probleem voordoet (zie de handleiding). Het moet dus worden gebruikt als het eerder is getest zonder het IGNORE-sleutelwoord.

Methode 3:gebruik INSERT … ON DUPLICATE KEY UPDATE:

Derde optie is het gebruik van INSERT … ON DUPLICATE KEY UPDATE syntaxis, en doe in het UPDATE-gedeelte gewoon niets een betekenisloze (lege) bewerking, zoals het berekenen van 0+0 (Geoffray stelt voor om theid=id-toewijzing te doen voor de MySQL-optimalisatie-engine om deze bewerking te negeren). Het voordeel van deze methode is dat het alleen dubbele sleutelgebeurtenissen negeert en nog steeds afbreekt bij andere fouten.

Als laatste bericht:dit bericht is geïnspireerd door Xaprb. Ik zou ook adviseren om zijn andere post over het schrijven van flexibele SQL-query's te raadplegen.



  1. Nieuwe en evoluerende PostgreSQL Enterprise-functies met recente releases

  2. Oude stijl Oracle Outer Join-syntaxis - Waarom de (+) aan de rechterkant van het isgelijkteken plaatsen in een Left Outer join?

  3. AlwaysOn-beschikbaarheidsgroepen configureren op SQL Server

  4. Proactieve SQL Server-statuscontroles, deel 4:ERRORLOG