18 Ekim 2007
Başlamak için: en son MySQL'den itibaren, başlıkta sunulan sözdizimi mümkün değildir. Ancak, mevcut işlevleri kullanarak beklenenleri gerçekleştirmenin birkaç kolay yolu vardır.
3 olası çözüm vardır: DUPLICATE KEY UPDATE ÜZERİNE INSERT IGNORE, REPLACE veya INSERT… kullanma.
Bir masamız olduğunu hayal edin:
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;
Şimdi, Ensembl'den transkript meta verilerini içe aktaran otomatik bir boru hattımız olduğunu ve çeşitli nedenlerle boru hattının herhangi bir yürütme adımında kırılabileceğini hayal edin. Bu nedenle, iki şeyi sağlamalıyız:
boru hattının tekrar tekrar yürütülmesi veritabanımızı yok etmeyecektir
yinelenen yürütmeler 'yinelenen birincil anahtar' hataları nedeniyle ölmeyecek.
Yöntem 1: REPLACE kullanma
Çok basit:
REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
Kayıt varsa, üzerine yazılır; henüz mevcut değilse oluşturulacaktır. Ancak, bu yöntemi kullanmak bizim durumumuz için verimli değildir: mevcut kayıtların üzerine yazmamız gerekmez, bunları atlamak iyidir.
Yöntem 2: INSERT IGNORE kullanma Ayrıca çok basit:
INSERT IGNORE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
Burada, 'ensembl_transcript_id' veritabanında zaten varsa, sessizce atlanır (yoksayılır). (Daha kesin olmak gerekirse, MySQL referans kılavuzundan bir alıntı: “IGNORE anahtar sözcüğünü kullanırsanız, INSERT ifadesini yürütürken oluşan hatalar bunun yerine uyarı olarak kabul edilir. Örneğin, IGNORE olmadan mevcut bir UNIQUE dizinini çoğaltan bir satır veya tablodaki PRIMARY KEY değeri yinelenen anahtar hatasına neden oluyor ve deyim iptal ediliyor. ”.) Kayıt henüz yoksa, oluşturulur.
Bu ikinci yöntemin, başka herhangi bir sorun olması durumunda sorgunun kürtaj yapılmaması da dahil olmak üzere çeşitli potansiyel zayıflıkları vardır (kılavuza bakınız). Bu nedenle, daha önce IGNORE anahtar sözcüğü olmadan test edilmişse kullanılmalıdır.
Yöntem 3: INSERT… kullanarak DUPLICATE KEY UPDATE:
Üçüncü seçenek kullanmaktır INSERT … ON DUPLICATE KEY UPDATE
sözdizimini ve UPDATE bölümünde 0 + 0 hesaplaması gibi anlamsız (boş) bir işlem yapmayın (Geoffray, bu işlemi yoksaymak için MySQL optimizasyon motorunun id = id atamasını yapmanızı önerir). Bu yöntemin avantajı, yalnızca yinelenen önemli olayları yok sayması ve yine de diğer hatalardan vazgeçmesidir.
Son bir uyarı olarak: Bu yazı Xaprb'den ilham aldı. Ben de esnek SQL sorguları yazma konusunda onun diğer yazı danışmak tavsiye ederim.