18 Oktober 2007
Untuk memulai: pada MySQL terbaru, sintaks yang disajikan dalam judul tidak mungkin. Tetapi ada beberapa cara yang sangat mudah untuk mencapai apa yang diharapkan menggunakan fungsi yang ada.
Ada 3 solusi yang mungkin: menggunakan INSERT IGNORE, REPLACE, atau INSERT ... ON DUPLICATE UPDATE KEY.
Bayangkan kita punya meja:
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;
Sekarang bayangkan bahwa kita memiliki pipa otomatis yang mengimpor meta-data transkrip dari Ensembl, dan bahwa karena berbagai alasan pipa itu mungkin rusak pada setiap langkah eksekusi. Jadi, kita perlu memastikan dua hal:
eksekusi berulang-ulang dari pipeline tidak akan menghancurkan database kami
eksekusi berulang tidak akan mati karena kesalahan 'duplikat kunci utama'.
Metode 1: menggunakan REPLACE
Ini sangat sederhana:
REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
Jika catatan ada, itu akan ditimpa; jika belum ada, itu akan dibuat. Namun, menggunakan metode ini tidak efisien untuk kasus kami: kami tidak perlu menimpa catatan yang ada, tidak apa-apa hanya untuk melewatkannya.
Metode 2: menggunakan INSERT IGNORE Juga sangat sederhana:
INSERT IGNORE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
Di sini, jika 'ensembl_transcript_id' sudah ada dalam database, ia akan dilewati secara diam-diam (diabaikan). (Lebih tepatnya, inilah kutipan dari manual referensi MySQL: "Jika Anda menggunakan kata kunci IGNORE, kesalahan yang terjadi saat mengeksekusi pernyataan INSERT diperlakukan sebagai peringatan. Sebagai contoh, tanpa IGNORE, baris yang menggandakan indeks UNIQUE yang ada atau nilai KUNCI UTAMA dalam tabel menyebabkan kesalahan duplikat kunci dan pernyataan dibatalkan. ".) Jika catatan belum ada, itu akan dibuat.
Metode kedua ini memiliki beberapa kelemahan potensial, termasuk non-aborsi permintaan jika terjadi masalah lain (lihat manual). Dengan demikian itu harus digunakan jika sebelumnya diuji tanpa kata kunci IGNORE.
Metode 3: menggunakan INSERT ... ON DUPLICATE UPDATE KUNCI:
Opsi ketiga adalah menggunakan INSERT … ON DUPLICATE KEY UPDATE
sintaks, dan di bagian UPDATE hanya melakukan apa-apa melakukan beberapa operasi (kosong) tidak berarti, seperti menghitung 0 + 0 (Geoffray menyarankan melakukan tugas id = id untuk mesin optimasi MySQL untuk mengabaikan operasi ini). Keuntungan dari metode ini adalah bahwa ia hanya mengabaikan peristiwa kunci duplikat, dan masih membatalkan kesalahan lainnya.
Sebagai pemberitahuan terakhir: posting ini terinspirasi oleh Xaprb. Saya juga menyarankan untuk berkonsultasi posnya yang lain tentang penulisan query SQL yang fleksibel.