INSERT… DUPLICATE ANAHTARINA (hiçbir şey yapmayın)


184

İki sütun için benzersiz bir anahtar içeren bir tablo var:

CREATE  TABLE `xpo`.`user_permanent_gift` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`fb_user_id` INT UNSIGNED NOT NULL ,
`gift_id` INT UNSIGNED NOT NULL ,
`purchase_timestamp` TIMESTAMP NULL DEFAULT now() ,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `user_gift_UNIQUE` (`fb_user_id` ASC, `gift_id` ASC) );

Bu tabloya bir satır eklemek istiyorum, ancak anahtar varsa hiçbir şey yapmayın! Anahtarların var olması nedeniyle bir hata oluşturulmasını istemiyorum.

Aşağıdaki sözdizimi olduğunu biliyorum:

INSERT ... ON DUPLICATE KEY UPDATE ...

ama şöyle bir şey var:

INSERT ... ON DUPLICATE KEY DO NOTHING 

?

Yanıtlar:


332

Evet, kullanın INSERT ... ON DUPLICATE KEY UPDATE id=id( idkendisine atanmış olsa bile satır güncellemesini tetiklemez ).

Hataları (dönüştürme hataları, yabancı anahtar hataları) ve otomatik arttırma alanı tükenmesini (yinelenen anahtar nedeniyle satır eklenmemiş olsa bile artırılır) umursamıyorsanız, kullanın INSERT IGNORE.


5
INSERT'ten sonra IGNORE eklemek için sözdiziminin geri kalanı aynı mıdır?
ufk

25
@ufk: parçası INSERT IGNOREolmadan ON DUPLICATE KEY, örneğinINSERT IGNORE INTO xpo.user_permanent_gift (...) VALUES (...)
BoltClock

125
INSERT IGNORE'un veri dönüştürme hataları gibi diğer hataları da göz ardı ettiğini unutmayın.
mjcopple

36
bu yüzden ON DUPLICATE KEY UPDATE kullanacağız id = id. Ben sadece anahtar kopyalarını yok saymak istemiyorum hata başka türlü.
ufk

7
INSERT IGNORE, satır
eklenmemiş

9

'Varsa ekle' NASIL UYGULANIR?

1. REPLACE INTO

Artıları:

  1. basit.

Eksileri:

  1. çok yavaş.

  2. Otomatik eşleme tuşu , giriş eşleşmeleri varsa DEĞİŞTİRİR (1 artar) unique keyveya primary keyeski girişi sildiğinden yenisini ekler.

2. INSERT IGNORE

Artıları:

  1. basit.

Eksileri:

  1. giriş eşleşmeleri varsa otomatik artış tuşu değişmez unique keyveya primary keyotomatik artış endeksi 1 artar

  2. veri dönüştürme hatası gibi diğer bazı hatalar / uyarılar yok sayılır.

3. INSERT ... ON DUPLICATE KEY UPDATE

Artıları:

  1. bununla 'kaydet veya güncelle' işlevini kolayca uygulayabilirsiniz

Eksileri:

  1. sadece güncelleme değil eklemek istiyorsanız nispeten karmaşık görünüyor.

  2. giriş eşleşmeleri varsa otomatik artış tuşu değişmez unique keyveya primary keyotomatik artış endeksi 1 artar

4. Giriş eşleşmeleri unique keyveya primary key?

@Toien tarafından yapılan yorumda belirtildiği gibi: motorunuz olarak kullanıyorsanız, "otomatik artış sütunu, innodb_autoinc_lock_modesürüm 5.1'den sonraki yapılandırmaya bağlıdır " innodb, ancak bu aynı zamanda eşzamanlılığı da etkiler, bu nedenle kullanılmadan önce iyi düşünülmesi gerekir. Şimdiye kadar daha iyi bir çözüm görmüyorum.


otomatik artış sütunu, innodb_autoinc_lock_mode5.1 sürümünden sonra yapılandırmaya bağlı olarak gerçekleşir
toien

1

Use ON DUPLICATE KEY UPDATE ...,
Negative: çünkü UPDATEikinci eylem için kaynakları kullanır.

Kullanım INSERT IGNORE ...,
Negatif: Bir şeyler ters giderse MySQL herhangi bir hata göstermez, bu nedenle hataları işleyemezsiniz. Yalnızca sorguyla ilgilenmiyorsanız kullanın.


@abdul burada açıkladığınız mysql desteği var mı?
Lalit Tarsariya
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.