18 жовтня 2007 року
Для початку: станом на останній MySQL синтаксис, представлений у заголовку, неможливий. Але є кілька дуже простих способів досягти того, що очікується, використовуючи існуючу функціональність.
Можливі 3 можливих рішення: використання INSERT IGNORE, ЗАМІНА або ВСТАВКА… НА ДУПЛІКАТИ КЛЮЧНОГО ОНОВЛЕННЯ.
Уявіть, у нас є таблиця:
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 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 - рядок, що дублює існуючий індекс UNIQUE або ПЕРШИЧНЕ КЛЮЧЕ значення в таблиці викликає помилку повторюваного ключа, а виписку скасовано. ".) Якщо запис ще не існує, він буде створений.
Цей другий метод має декілька потенційних недоліків, включаючи непереривання запиту у випадку виникнення будь-якої іншої проблеми (див. Посібник). Таким чином, його слід використовувати, якщо раніше було протестовано без ключового слова IGNORE.
Спосіб 3: використання INSERT… ON DUPLICATE KEY UPDATE:
Третій варіант - використовувати INSERT … ON DUPLICATE KEY UPDATE
синтаксис, і в частині UPDATE просто не робити нічого безглуздої (порожньої) операції, як-от обчислити 0 + 0 (Geoffray пропонує виконувати призначення id = id для механізму оптимізації MySQL, щоб ігнорувати цю операцію). Перевагою цього методу є те, що він ігнорує лише повторювані ключові події та все-таки перериває інші помилки.
Як остаточне зауваження: цю публікацію надихнув Xaprb. Я б також порадив проконсультувати його іншу посаду щодо написання гнучких SQL-запитів.