&; 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
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 |
---- ------
taklit ne kadar "Ekle Yoksay"...
Nasıl "yinelenen OLMADAN birden f...
'olmayan mutasyona " için en ...
Tüysüz: Yoksay " Nasıl;<anahtar...
Ekle "salt okunur" <input...