İlk Yöntem
Öncelikle update işlemi gerçekleştirilir, bu işlem sonucunda etkilenen kayıt sayısı kontrol edilir, eğer @@ROWCOUNT = 0 ise güncellenebilecek bir kayıt bulunmuyor demektir, bu durumda kayıt eklenir.
|
|
İkinci Yöntem
Öncelikle kaydın olup olmadığını anlamak için IF EXISTS kullanılarak select cümlesi çalştırılır. Kayıt varsa güncelleme işlemi yapılıyor, yoksa ekleme işlemi yapılıyor.
|
|
Peki hangi yöntem performans açısından daha iyidir?
Kesinlikle X. yöntem kullanılmalıdır gibi birşey söylemek mümkün değil, tamamen kullandığınız yapıyla ilgili sizin karar vermeniz gerekmektedir. Şöyle ki,
- Eğer kayıt büyük ihtimalle bulunuyorsa yani güncelleme işleminin büyük ihtimalle gerçekleşeceğini düşünüyorsanız 1. yöntemi uygulamak performans açısından daha iyi olacaktır.
- Eğer büyük ihtimalle insert işlemi gerçekleşecek diyorsanız, 1. yönteme göre 2. yöntemi uygulamak daha mantıklı olacaktır. Çünkü INSERT ve UPDATE işlemleri pahalı işlemlerdir.
sonraki yazı Apache mod_rewrite ile üşengeç seo |
Şu neden işimizi göremedi;
REPLACE INTO test VALUES ('deneme', 1)
@ikuzgun,
Yazımda bahsettiğim konu ile vermiş olduğun linkte anlatılan replace mantığının alakası yok maalesef ve verdiğin linkteki kodlar MySQL için. Yukarıdaki kodlar MsSQL içindir, anlaşılacağını düşünerekten MsSQL olduğunu yazma gereği duymamıştım aslında.
@UgurCelenk yazıdaki performans bilgilendirmesi için teşekkürler..
mysql için aşağıdaki gibi bir kod parçası kullanılabilir.
|
|
Yanlışım varsa düzeltin ama ilk işlemde (1) update (2) if (3)insert işlemini yapıyor. Tabii yani kayıt için. Fakat ikinci metodda (1) if (2) insert veya update işlemini yapıyor. Bu sebeple ikinci yöntem daha doğrudur diyebilirim. ( Benim kullandığım yöntem de budur. )
Ayrıca MS Sql Server 2008 ile gelen "merge" anahtar kelimesi ile, bu kayıt sorgulama işlemine de gerek kalmıyor. Yani varsa update yoksa insert olmadı delete gibi bir tanımlamayı tek bir işlemle, yükü ms'e atarak, yapılabilir. ( Bunun Sql Server 2005 SP2 ile geldiğini de duydum, deneme şansım olmadı. )
@freeuser, MySQL versiyonu için teşekkürler.
@puraxays, bence ynılıyorsun, öncelikle ilk yöntemdeki if ile ikinci yöntemdeki if aynı if değil, "if exists" birisi, select cümlesi çalışıyor. Yani şu yöntem daha doğrudur diye bir genelleme yapmak yanlış olur ama sizin kullanmak istediğiniz nokta da veritabanı ve işleyiş yapısına göre "şu yöntem daha uygun olur" diyebilirsiniz.
SQL 2008 ile gelen yenilikleri henüz deneyemedim, bilgilendirdiğin için teşekkürler
@UgurCelenk, Şimdi ufak bi araştırma yaptım ve dediğinde haklı olduğu kanısına vardım. İki yöntem arasında ölçülebilir/görülebilir bir fark yok. Yer ve şartlara göre değişiklik gösterebilir ki, buna da değmez. Ve yazılan kodun okunabirliliği için de bir standart oluşturulması daha önemlidir diye düşünüyorum. Ben ikinci yöntemi kullanırdım, ilk yöntemi bilgilendirdiğin için teşekkürler..
Kolay gelsin.. =)
1. yöntem güzelmiş daha önce görmedim hep 2. yöntemi kullanırdım
Ben aşağıdaki yapıyı kullanıyorum şimdiye kadarda bi problem yaşamadım.
if @id>0 update else insert
IF (SELECT TOP 1 ID FROM Tablo1 WHERE ID = @ID)<>0
BEGIN
UPDATE Tablo1 SET Kolon1=@Kolon1_Degeri WHERE ID = @ID
END
ELSE BEGIN
INSERT INTO Tablo1 (ID, Kolon1) VALUES (@ID, @Kolon1_Degeri)
END
pillinetwork sitelerine yorum ekleyebilmek ve daha fazlası için, üye olun ya da giriş yapın.
Nokta ve pilli ortak yapımı olan kodaman.org hep birlikte içerik üretip gelirini yazarları ile paylaştığımız kolektif bir kod yazarları blogudur. Siz de katılabilirsiniz.