Използвайте INSERT IGNORE INTO table
.
Има също INSERT … ON DUPLICATE KEY UPDATE
синтаксис и можете да намерите обяснения в 13.2.6.2 INSERT ... ON DUPLICATE KEY UPDATE Statement
.
Публикация от bogdan.org.ua според уебкешът на Google :
18 октомври 2007 г.
За начало:от най-новия MySQL синтаксисът, представен в заглавието, не е възможен. Но има няколко много лесни начина да постигнете това, което се очаква, като използвате съществуващата функционалност.
Има 3 възможни решения:използване на INSERT IGNORE, REPLACE, или INSERT ... ПРИ АКТУАЛИЗИРАНЕ НА ДУБЛИКАТ КЛЮЧ.
Представете си, че имаме маса:
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;
Сега си представете, че имаме автоматичен конвейер, импортиращ преписи, мета-данни от Ensembl и че поради различни причини конвейерът може да бъде счупен при всяка стъпка от изпълнение. По този начин трябва да гарантираме две неща:
- повтарящите се изпълнения на конвейера няма да унищожат нашата> база данни
- повтарящите се изпълнения няма да умрат поради грешки в „дубликат> първичен ключ“.
Метод 1:използване на REPLACE
Много е просто:
REPLACE INTO `transcripts` SET `ensembl_transcript_id` = 'ENSORGT00000000001', `transcript_chrom_start` = 12345, `transcript_chrom_end` = 12678;
Ако записът съществува, той ще бъде презаписан; ако все още не съществува, ще бъде създаден. Използването на този метод обаче не е ефективно за нашия случай:не е необходимо да презаписваме съществуващи записи, добре е просто да ги пропуснем.
Метод 2:използване на INSERT IGNORE Също много прост:
INSERT IGNORE INTO `transcripts` SET `ensembl_transcript_id` = 'ENSORGT00000000001', `transcript_chrom_start` = 12345, `transcript_chrom_end` = 12678;
Тук, ако „ensembl_transcript_id“ вече присъства в базата данни, той ще бъде безшумно пропуснат (игнориран). (За да бъдем по-точни, ето цитат от справочното ръководство на MySQL:„Ако използвате ключовата дума IGNORE, грешките, възникнали при изпълнение на оператора INSERT, се третират като предупреждения вместо това. Например, без IGNORE, ред, който дублира съществуващ УНИКАЛЕН индекс или ПЪРВИЧЕН КЛЮЧ стойност в таблицата причинява грешка с дублиран ключ и изявлението се прекратява.”.) Ако записът все още не съществува, той ще бъде създаден.
Този втори метод има няколко потенциални слабости, включително непрекратяване на заявката в случай, че възникне някакъв друг проблем (вижте ръководството). Затова трябва да се използва, ако е тестван преди това без ключовата дума IGNORE.
Метод 3:използване на INSERT ... ПРИ АКТУАЛИЗИРАНЕ НА ДУБЛИКАТ КЛЮЧ:
Третата опция е да използвате
INSERT … ON DUPLICATE KEY UPDATE
синтаксис, а в частта UPDATE просто не правете нищо, извършвайте някаква безсмислена (празна) операция, като изчисляване на 0+0 (Geoffray предлага да направите присвояване на theid=id за оптимизационната машина на MySQL, за да игнорирате тази операция). Предимството на този метод е, че той само игнорира събития с дублирани ключове и все пак прекратява при други грешки.Като последно забележка:тази публикация е вдъхновена от Xaprb. Бих посъветвал също да се консултирате с другата му публикация за писане на гъвкави SQL заявки.