sql >> Databáze >  >> RDS >> Mysql

Jak mohu v MySQL provést „vložit, pokud neexistuje“?

Použijte INSERT IGNORE INTO table .

K dispozici je také INSERT … ON DUPLICATE KEY UPDATE syntaxi a vysvětlení najdete v 13.2.6.2 INSERT ... ON DUPICATE KEY UPDATE Statement .

Příspěvek od bogdan.org.ua podle webová mezipaměť Google :

18. října 2007

Pro začátek:od nejnovějšího MySQL není syntaxe uvedená v názvu možná. Existuje však několik velmi snadných způsobů, jak dosáhnout toho, co se očekává, pomocí stávajících funkcí.

Existují 3 možná řešení:pomocí INSERT IGNORE, REPLACE nebo INSERT … PŘI AKTUALIZACI DUPLIKÁTNÍHO KLÍČE.

Představte si, že máme stůl:

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;

Nyní si představte, že máme automatický kanál importující transkriptová meta-data z Ensembl a že z různých důvodů může být kanál přerušen v kterémkoli kroku provádění. Musíme tedy zajistit dvě věci:

  1. opakované spouštění kanálu nezničí naši> databázi
  1. opakovaná spouštění nezmizí kvůli chybám „duplicitního> primárního klíče“.

Metoda 1:pomocí REPLACE

Je to velmi jednoduché:

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

Pokud záznam existuje, bude přepsán; pokud ještě neexistuje, bude vytvořen. Použití této metody však v našem případě není efektivní:nepotřebujeme přepisovat existující záznamy, stačí je přeskočit.

Metoda 2:pomocí INSERT IGNORE Také velmi jednoduché:

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

Zde, pokud je 'ensembl_transscript_id' již v databázi přítomen, bude tiše přeskočen (ignorován). (Abych byl přesnější, zde je citát z referenční příručky MySQL:„Pokud použijete klíčové slovo IGNORE, chyby, ke kterým dojde při provádění příkazu INSERT, jsou namísto toho považovány za varování. Například bez IGNORE bude řádek, který duplikuje existující UNIQUE index nebo PRIMARY KEY hodnota v tabulce způsobí chybu duplicitního klíče a příkaz je přerušen.”.) Pokud záznam ještě neexistuje, bude vytvořen.

Tato druhá metoda má několik potenciálních slabin, včetně nepřerušení dotazu v případě, že se vyskytne jakýkoli jiný problém (viz manuál). Proto by měl být použit, pokud byl dříve testován bez klíčového slova IGNORE.

Metoda 3:pomocí INSERT … PŘI AKTUALIZACI DUPLIKÁTNÍHO KLÍČE:

Třetí možností je použít INSERT … ON DUPLICATE KEY UPDATE syntaxi a v části UPDATE prostě nic neprovádějte a neprovádějte nějakou nesmyslnou (prázdnou) operaci, jako je výpočet 0+0 (Geoffray navrhuje provést přiřazení theid=id pro optimalizační engine MySQL, aby tuto operaci ignoroval). Výhodou této metody je, že ignoruje pouze události duplicatekey a stále se ruší při jiných chybách.

Jako poslední upozornění:tento příspěvek byl inspirován Xaprbem. Doporučil bych také přečíst si jeho další příspěvek o psaní flexibilních SQL dotazů.



  1. Materialized Views – Identifikace poslední aktualizace

  2. Jak změnit text na malá písmena v SQL

  3. DBMS_SCHEDULER Příklad spuštění úlohy každou hodinu

  4. ALTER &DROP Table DDL s okamžitým spuštěním v databázi Oracle