MySQL’de veri güncellemelerini verimli bir şekilde yönetmek, genellikle mevcut bir kaydı güncellemeniz veya kayıt zaten yoksa yeni bir kayıt eklemeniz gereken durumları ele almayı gerektirir. Yaygın olarak upsert olarak bilinen bu işlem, veri bütünlüğünü korumak ve tutarsızlıkları önlemek için çok önemlidir. Bu makale, MySQL’de upsert işlemlerini gerçekleştirmenin çeşitli yöntemlerini inceleyerek, güçlü ve zayıf yönlerini karşılaştırarak belirli ihtiyaçlarınız için en iyi yaklaşımı seçmenize yardımcı olur.
İçindekiler
- Yöntem 1:
INSERT ... ON DUPLICATE KEY UPDATE
Kullanımı - Yöntem 2: Saklı Yordam Kullanımı
- Yöntem 3:
MERGE
Deyimi Kullanımı (MySQL 8.0 ve üzeri) - Doğru Yöntemi Seçme
- Örnek Senaryolar ve Kod
Yöntem 1: INSERT ... ON DUPLICATE KEY UPDATE
Kullanımı
Bu, MySQL’de upsert işlemleri için en basit ve genellikle en verimli yöntemdir. Yinelenen bir anahtar bulunursa hangi sütunların güncelleneceğini belirten ON DUPLICATE KEY UPDATE
yan tümcesini kullanır. Hedef tabloda benzersiz bir anahtar kısıtlaması (birincil anahtar veya benzersiz indeks) gereklidir.
INSERT INTO tablo_adı (sütun1, sütun2, sütun3, ...)
VALUES (değer1, değer2, değer3, ...);
ON DUPLICATE KEY UPDATE
sütun1 = VALUES(sütun1),
sütun2 = VALUES(sütun2),
...;
VALUES(sütunN)
, yalnızca belirtilen sütunların güncellenmesini sağlayan INSERT
deyimindeki değerlere başvurur.
Yöntem 2: Saklı Yordam Kullanımı
Karmaşık senaryolar için veya upsert mantığı üzerinde daha fazla kontrole ihtiyaç duyulduğunda, saklı bir yordam esneklik sunar. Varlık kontrolünü ve güncelleme/ekleme mantığını yordam içine kapsularsınız.
DELIMITER //
CREATE PROCEDURE upsert_veri(IN p_id INT, IN p_ad VARCHAR(255), IN p_değer INT)
BEGIN
DECLARE mevcut_satır INT DEFAULT 0;
SELECT COUNT(*) INTO mevcut_satır FROM tablo_adı WHERE id = p_id;
IF mevcut_satır > 0 THEN
UPDATE tablo_adı SET ad = p_ad, değer = p_değer WHERE id = p_id;
ELSE
INSERT INTO tablo_adı (id, ad, değer) VALUES (p_id, p_ad, p_değer);
END IF;
END //
DELIMITER ;
Yöntem 3: MERGE
Deyimi Kullanımı (MySQL 8.0 ve üzeri)
MySQL 8.0, daha güçlü ve açıklayıcı bir upsert çözümü sunan MERGE
deyimini tanıtmıştır. Eşleşen koşullara bağlı olarak koşullu güncellemeler ve eklemeler sağlar.
MERGE INTO tablo_adı AS hedef
USING (SELECT p_id, p_ad, p_değer) AS kaynak
ON (hedef.id = kaynak.p_id)
WHEN MATCHED THEN UPDATE SET hedef.ad = kaynak.p_ad, hedef.değer = kaynak.p_değer
WHEN NOT MATCHED THEN INSERT (id, ad, değer) VALUES (kaynak.p_id, kaynak.p_ad, kaynak.p_değer);
Doğru Yöntemi Seçme
INSERT ... ON DUPLICATE KEY UPDATE
: Benzersiz anahtar kısıtlaması ve basit güncelleme mantığına sahip basit upsert işlemleri için en iyisidir. Genellikle en verimli olanıdır.- Saklı Yordam: Karmaşık mantık, koşullu güncellemeler veya upsert içinde ek işlemler için uygundur. Karmaşık senaryolar için daha iyi kapsülleme ve sürdürülebilirlik sunar.
MERGE
Deyimi: Özellikle birden fazla koşul ve eylemle karmaşık upsert işlemlerini ele almanın özlü ve güçlü bir yolunu sağlar. MySQL 8.0 veya üzeri gerektirir.
Örnek Senaryolar ve Kod
id
(INT, BİRİNCİL ANAHTAR), ad
(VARCHAR(255)) ve fiyat
(DECIMAL(10,2)) sütunlarına sahip bir ürünler
tablosunu düşünün.
INSERT ... ON DUPLICATE KEY UPDATE
kullanarak:
INSERT INTO ürünler (id, ad, fiyat) VALUES (1, 'Ürün A', 19.99)
ON DUPLICATE KEY UPDATE ad = VALUES(ad), fiyat = VALUES(fiyat);
Bu, id
1 yoksa yeni bir satır ekler veya varsa ad
ve fiyat
değerlerini günceller.
Bu makale, MySQL’de upsert tekniklerinin kapsamlı bir genel bakışını sunmaktadır. En uygun yöntem, belirli gereksinimlerinize ve veri manipülasyonu karmaşıklığınıza bağlıdır. Her zaman performans etkilerini göz önünde bulundurun ve uygulamanız için en verimli yaklaşımı seçin.