SORU
14 ŞUBAT 2009, CUMARTESİ


&; EKLE YOKSAY" vs "EKLE ... YİNELENEN GÜNCELLEŞTİRME "ANAHTAR"

Kaç satır ile INSERT deyimi yürütülürken, aksi takdirde arızaya neden olacağını yinelenen girdileri atlamak istiyorum. Biraz araştırmadan sonra seçeneklerimi de kullanımı söz konusu olabilir.

  • Bazı maliyet gereksiz bir güncelleme ima ON DUPLICATE KEY UPDATE ya
  • Habersiz açabilmek için başarısızlık başka türlü daveti ima INSERT IGNORE.

Bu varsayımlar mıyım? Sadece çiftleri neden sadece diğer satırlar için devam edebilir bu satırları atlamak için en iyi yolu nedir?

CEVAP
14 ŞUBAT 2009, CUMARTESİ


INSERT...ON DUPLICATE KEY UPDATE kullanmanızı tavsiye ederim.

Eğer kullanıyorsanız INSERT IGNORE, sonra da satır aslında eğer yinelenen bir anahtar sonuçları takılı olmayacak. Ama deyim bir hata oluşturmaz. Bir yerine uyarı oluşturur. Bu durumlar şunlardır:

  • Bir ekleme PRIMARY KEY UNIQUE kısıtlamaları ile sütunlar yinelenen anahtarı.
  • NOT NULL bir kısıtlama ile bir sütuna NULL ekleme.
  • Bölümlenmiş bir tablo için bir satır ekleme, ancak eklemek yok değerleri bir bölüm göster.

Eğer kullanıyorsanız REPLACE, MySQL aslında DELETE bazı beklenmedik yan etkileri vardır INSERT bir dahili olarak, ardından gelen:

  • Otomatik artış yeni bir KİMLİK tahsis edilir.
  • Yabancı anahtarlar ile bağımlı satır basamaklı yabancı tuşlarını kullanın () silinmiş olabilir veya başka REPLACE önlemek.
  • DELETE yangın tetikler gereksiz yere yürütülür.
  • Yan etkileri çoğaltma köleler için de yayılır.

düzeltme:her iki REPLACE INSERT...ON DUPLICATE KEY UPDATE standart olmayan, özel buluşlar belirli MySQL için. ANSI SQL 2003 aynı ihtiyacı (ve daha fazla) çözebilecek MERGE ifadesi tanımlar, ama MySQL MERGE deyimini desteklemez.


Bir kullanıcı çalıştım bu yazıyı düzenlemek için Düzenle moderatör tarafından reddedildi. Düzenle INSERT...ON DUPLICATE KEY UPDATE otomatik artış yeni bir kimlik tahsis edilecek neden olan bir iddia eklemek için çalıştı. Yeni kimlik olduğu doğruduroluşturulandeğiştirilen satır kullanılmaz ama.

Gösteri altında, Percona Server 5.5.28 ile test bakın. Yapılandırma innodb_autoinc_lock_mode=1 değişken (varsayılan):

mysql> create table foo (id serial primary key, u int, unique key (u));
mysql> insert into foo (u) values (10);
mysql> select * from foo;
 ---- ------ 
| id | u    |
 ---- ------ 
|  1 |   10 |
 ---- ------ 

mysql> show create table foo\G
CREATE TABLE `foo` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `u` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `u` (`u`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1

mysql> insert into foo (u) values (10) on duplicate key update u = 20;
mysql> select * from foo;
 ---- ------ 
| id | u    |
 ---- ------ 
|  1 |   20 |
 ---- ------ 

mysql> show create table foo\G
CREATE TABLE `foo` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `u` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `u` (`u`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1

Yukarıdaki İODKU deyimi yinelenen algılar ve güncelleştirme u değerini değiştirmek için çağırır gösterir. AUTO_INCREMENT=3 bir kimlik oluşturulmuş, ama satır kullanıldığını gösterir unutmayın.

REPLACE oysa orijinal satır ekler silmek yeni bir satır oluşturuluyorveotomatik artış yeni bir kimliği saklamak:

mysql> select * from foo;
 ---- ------ 
| id | u    |
 ---- ------ 
|  1 |   20 |
 ---- ------ 
mysql> replace into foo (u) values (20);
mysql> select * from foo;
 ---- ------ 
| id | u    |
 ---- ------ 
|  3 |   20 |
 ---- ------ 

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • David Wills

    David Wills

    31 Aralık 2007
  • Grace Su

    Grace Su

    6 Ocak 2006
  • talkandroid

    talkandroid

    27 Mayıs 2010