pillinetwork hesabınızla giriş yapın.

T-SQL : 'Kayıt varsa güncelle, yoksa ekle' durumu için iki farklı yöntem

İ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.

1
2
3
4
5
6
7
UPDATE Tablo1 SET Kolon1 = @Kolon1_Degeri WHERE
ID = @ID
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO Tablo1 (Kolon1)
VALUES (@Kolon1_Degeri)
END

İ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.

1
2
3
4
5
6
7
8
9
10
11
IF EXISTS (SELECT ID FROM Tablo1 WHERE
ID = @ID)
BEGIN
UPDATE Tablo1 SET Kolon1= @Kolon1_Degeri
WHERE ID = @ID
END
ELSE
BEGIN
INSERT INTO Tablo1 (ID, Kolon1) VALUES
(@ID, @Kolon1_Degeri)
END

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.

/* UgurCelenk yazdı. 13 Kasım 2008 19:25. 10 yorum var */

Yorumlar

Güzel bir örnek.
Teşekkürler.

Ş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.

/* http://www.ugurcelenk.com */

@UgurCelenk yazıdaki performans bilgilendirmesi için teşekkürler..
mysql için aşağıdaki gibi bir kod parçası kullanılabilir.

1
2
INSERT INTO Tablo1 (ID, Kolon1) VALUES (@ID, @Kolon1_Degeri)
ON DUPLICATE KEY UPDATE ID=@ID;

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

/* http://www.ugurcelenk.com */

@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

üye olunpillinetwork sitelerine yorum ekleyebilmek ve daha fazlası için, üye olun ya da giriş yapın.

Bu yazıyı rapor et. Kural dışı içeriğe rastladığınızda editörlerimize rapor ederek müdahale edilmesini sağlayabilirsiniz. (Hangi durumlarda rapor edebilirim?)

Bu site

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.

pilliilan

son yorumlar

arama

pillinetwork