sql >> Database teknologi >  >> RDS >> Mysql

Hvordan kan jeg lave 'indsæt hvis ikke eksisterer' i MySQL?

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:

  1. gentagne afviklinger af pipelinen vil ikke ødelægge vores> database
  1. 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.



  1. Hvad er den mest elegante måde at gemme tidsstempel med nanosec i postgresql?

  2. Find ud af, om en partition er komprimeret i SQL Server (T-SQL)

  3. postgres - hvor i (liste) - kolonne eksisterer ikke

  4. Sådan undslipper du enkelt citat, specielle tegn i MySQL