SORU
1 EYLÜL 2009, Salı


Nasıl 'Ekle' Eğer yoksa MySQL mi?

Googling tarafından başladım ve bu zaman uyumu tablolar hakkında konuşan 10* *bulundu.

~14 milyon kayıt içeren bir tablo var. Eğer ben eklemek için daha fazla veri aynı biçimi vardır sağlamanın tek yolu kayıt etmek istiyorum eklemez zaten kullanmadan bir çift sorguları (yani, bir sorgu için kontrol edin ve takın sonuç kümesi boş)?

Bir alan üzerinde unique kısıtlama insert Eğer oradaysa eğer başarısız olacağını garanti ediyor mu?

Olduğu gibisadecephp ile ekleme ben sorun zaman kısıtlaması, kod ölüyordu.

CEVAP
1 EYLÜL 2009, Salı


INSERT IGNORE INTO table kullanın

http://bogdan.org.ua/2007/10/18/mysql-insert-if-not-exists-syntax.html bkz

ayrıca INSERT … ON DUPLICATE KEY UPDATE söz dizimi, dev.mysql.com ilgili açıklamalar bulabilirsiniz


Google's webcache göre bogdan.org.ua gelen mesaj:

Ekim 2007 18

En son MySQL sözdizimi başlık sunulan değil olarak başlatmak için: mümkün. Ama ne başarmak için çok kolay yolları vardır mevcut fonksiyonlar kullanma bekleniyor.

Orada 3 Olası çözümler: EKLE YOKSAY, DEĞİŞTİR kullanarak, ya da EKLE ... ANAHTARI GÜNCELLEŞTİRME, YİNELENEN.

Biz bir masa düşünün:

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 otomatik bir boru hattı transkript alma olduğunu hayal edin meta-veri Ensembl ve çeşitli sebeplerden dolayı bu boru hattından yürütme herhangi bir aşamada kırılmış olabilir. Böylece, iki sağlamalıyız şey: 1) ardışık tekrarlanan infazlar bizim değil yok edecek veritabanı, ve 2) tekrar idamlar nedeniyle ‘yinelenen ölmeyecek birincil anahtar’ hataları.

Yöntem 1: YERİNE kullanma

Çok basit:

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

Eğer kayıt varsa, Eğer Henüz yoksa üzerine; var, oluşturulacaktır. Ancak, bu yöntemi kullanarak etkili değil davamız için: varolan kayıtları, sorun yok üzerine yazmak zorunda değiliz onları atlamak için.

Yöntem 2: EKLEME kullanımı Da çok basit YOKSAY:

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

‘Ensembl_transcript_id’ zaten varsa burada, veritabanı, sessizce atladı (göz ardı) olacaktır. (Daha kesin olmak işte MySQL reference manual bir alıntı: Eğer kullanıyorsanız “GÖRMEZDEN anahtar kelime, INSERT deyimi yürütme sırasında oluşan hataları şunlardır uyarılar yerine muamelesi. Bir satır göz ardı etmeden örneğin, varolan BENZERSİZ bir dizin veya tablo BİRİNCİL ANAHTAR değer çiftleri yinelenen anahtar hata neden olur ve deyim iptal edildi.”). Eğer kayıt henüz yok, oluşturulacaktır.

Bu ikinci yöntem, çok sayıda potansiyel zayıflıkları vardır olmayan kürtaj başka bir sorun (bkz oluşması durumunda sorgu El Kitabı). Eğer daha önce test olmadan kullanılması gerektiğini böylece Anahtar kelime YOKSAY.

Bir seçenek daha var: EKLE ... YİNELENEN KEY UPDATE kullanımı sözdizimi ve GÜNCELLEME kısmı sadece bazı anlamsız yaparsın (boş) işlemi gibi 0 0 (Geoffray yapıyor önerir hesaplama id=etmemek MySQL optimizasyon altyapısı için kimlik atama işlemi). Bu yöntemin avantajı, sadece yinelenen yok sayıyor. önemli olaylar, ve hala diğer hataları iptal eder.

Son bir uyarı: Bu yazı Xaprb esinlenilmiştir. Ayrıca tavsiye ederim esnek SQL sorgu yazma ile ilgili diğer görevinden başvurun.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Gavin Hoey

    Gavin Hoey

    21 Aralık 2007
  • lilstevie89

    lilstevie89

    25 Mart 2011
  • pilslajt

    pilslajt

    20 HAZİRAN 2008