Brug INSERT IGNORE INTO table
.
Der er også INSERT … ON DUPLICATE KEY UPDATE
syntaks, og du kan finde forklaringer i 13.2.6.2 INDSÆT ... PÅ DUBLIKAT NØGLOPDATERING-erklæring
.
Indlæg fra bogdan.org.ua ifølge Googles webcache :
18. oktober 2007
For at starte:fra den seneste MySQL er syntaks præsenteret i titlen ikke mulig. Men der er flere meget nemme måder at opnå det forventede ved at bruge eksisterende funktionalitet.
Der er 3 mulige løsninger:Brug INSERT IGNORE, REPLACE eller INSERT … PÅ DUBLIKAT NØGLOPDATERING.
Forestil dig, at vi har et 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;
Forestil dig nu, at vi har en automatisk pipeline, der importerer transcriptsmeta-data fra Ensembl, og at pipelinen af forskellige årsager kan blive brudt på et hvilket som helst trin i eksekveringen. Derfor skal vi sikre to ting:
- gentagne afviklinger af pipelinen vil ikke ødelægge vores> database
- gentagne henrettelser dør ikke på grund af "duplicate> primær nøgle"-fejl.
Metode 1:Brug af REPLACE
Det er meget enkelt:
REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
Hvis posten eksisterer, vil den blive overskrevet; hvis den ikke eksisterer endnu, vil den blive oprettet. Men at bruge denne metode er ikke effektiv i vores tilfælde:vi behøver ikke at overskrive eksisterende poster, det er fint at springe dem over.
Metode 2:Brug af INSERT IGNORE Også meget enkel:
INSERT IGNORE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
Her, hvis 'ensembl_transcript_id' allerede er til stede i databasen, vil den blive sprunget over (ignoreret). (For at være mere præcis er her et citat fra MySQL-referencemanualen:"Hvis du bruger IGNORE-søgeordet, behandles fejl, der opstår under udførelse af INSERT-sætningen, som advarsler i stedet. For eksempel uden IGNORE, en række, der duplikerer et eksisterende UNIKT indeks eller PRIMÆR NØGLE værdi i tabellen forårsager en duplikatnøglefejl, og sætningen afbrydes.”.) Hvis posten endnu ikke eksisterer, vil den blive oprettet.
Denne anden metode har flere potentielle svagheder, herunder ikke-afbrydelse af forespørgslen, hvis der opstår et andet problem (se manualen). Derfor bør den bruges, hvis den tidligere er testet uden IGNORE-søgeordet.
Metode 3:Brug af INSERT … PÅ DUBLIKAT NØGLOPDATERING:
Tredje mulighed er at bruge INSERT … ON DUPLICATE KEY UPDATE
syntaks, og i UPDATE-delen skal du bare ikke gøre noget ved at lave en meningsløs (tom) operation, som at beregne 0+0 (Geoffray foreslår at udføre theid=id-tildelingen for MySQL-optimeringsmotoren for at ignorere denne operation). Fordelen ved denne metode er, at den kun ignorerer duplicatekey-hændelser og stadig afbryder ved andre fejl.
Som en sidste bemærkning:dette indlæg er inspireret af Xaprb. Jeg vil også råde dig til at konsultere hans andet indlæg om at skrive fleksible SQL-forespørgsler.