SQL UPDATE Komutu Nasıl Kullanılır? Güvenli Güncelleme Örnekleri


0

SQL UPDATE komutu ile tablo satırlarını güvenle güncellemeyi öğrenin. SELECT doğrulaması, WHERE koşulu, transaction ve @@ROWCOUNT kontrolleriyle adım adım rehbe

Önemli not: Örnekler Microsoft SQL Server T-SQL içindir; MySQL, PostgreSQL ve SQLite sözdizimi/araçları farklılık gösterebilir.

SQL UPDATE komutu, bir tablodaki mevcut satırların sütun değerlerini değiştirmek için kullanılır. Temel biçim şudur: UPDATE tablo SET sütun = değer WHERE koşul. WHERE koşulunu atlarsanız tablodaki tüm satırlar güncellenir. Bu yüzden önce SELECT ile etkilenecek satırları görmek en güvenli yaklaşımdır.

Bu rehberdeki örnekler Microsoft SQL Server T-SQL içindir. MySQL, PostgreSQL ve SQLite sözdizimi ya da araçları farklılık gösterebilir. Resmi başvuru kaynağı Microsoft Learn üzerindeki UPDATE (Transact-SQL) belgesidir.

SQL UPDATE komutu için ön koşullar

  • SQL Server örneğine bağlanabilen bir istemci (örneğin SQL Server Management Studio veya Azure Data Studio).
  • Hedef tablo üzerinde UPDATE yetkisi olan bir kullanıcı hesabı.
  • Güncelleme yapacağınız tablonun yapısını ve sütun veri türlerini bilmek.
  • Üretim verisiyle çalışıyorsanız önceden alınmış bir yedek veya geri alma planı.
  • Test için örnek kimlik ve örnek veri kullanmak; gerçek müşteri verisiyle deneme yapmamak.

Aşağıdaki örneklerde Musteriler adlı örnek bir tablo kullanılır. Sütunlar: MusteriID, Ad, Soyad, Sehir, Puan ve KayitTarihi. Bu tablo ve veriler yalnızca gösterim amaçlıdır.

Örnek tablo oluşturma ve örnek veri ekleme

CREATE TABLE Musteriler (
    MusteriID   INT PRIMARY KEY,
    Ad          NVARCHAR(50) NOT NULL,
    Soyad       NVARCHAR(50) NOT NULL,
    Sehir       NVARCHAR(50) NULL,
    Puan        INT NULL,
    KayitTarihi DATE NOT NULL
);

INSERT INTO Musteriler (MusteriID, Ad, Soyad, Sehir, Puan, KayitTarihi)
VALUES
    (1, N'Ayşe',  N'Yılmaz', N'Ankara',  120, '2024-01-15'),
    (2, N'Mehmet', N'Demir',  N'İzmir',    80, '2024-02-03'),
    (3, N'Zeynep', N'Kaya',   N'Ankara',  200, '2024-03-11'),
    (4, N'Ali',    N'Şahin',  NULL,        50, '2024-04-22');

UPDATE ve SET temel sözdizimi

UPDATE ifadesi hedef tabloyu belirtir. SET ifadesi ise hangi sütunların hangi değerleri alacağını tanımlar. WHERE koşulu, güncellenecek satırları sınırlar. Sıralama her zaman UPDATE, SET, WHERE biçimindedir.

Tek sütun güncelleme

UPDATE Musteriler
SET Sehir = N'Bursa'
WHERE MusteriID = 2;

Bu ifade yalnızca MusteriID değeri 2 olan satırın Sehir sütununu değiştirir. Diğer satırlar etkilenmez. Metin değerlerinde N öneki, Unicode metinler için kullanılır.

Önce SELECT ile etkilenecek satırları görme

Her UPDATE işleminden önce aynı WHERE koşuluyla SELECT çalıştırın. Böylece kaç satırın ve hangi satırların değişeceğini görürsünüz. Bu alışkanlık, yanlışlıkla tüm tabloyu güncelleme riskini büyük ölçüde azaltır.

Güncellemeden önce doğrulama

-- Önce etkilenecek satırları görün
SELECT MusteriID, Ad, Soyad, Sehir, Puan
FROM Musteriler
WHERE Sehir = N'Ankara';

-- Sonuç beklediğiniz gibiyse güncelleyin
UPDATE Musteriler
SET Puan = Puan + 10
WHERE Sehir = N'Ankara';

SELECT sonucu beklediğiniz satırları göstermiyorsa WHERE koşulunu düzeltin. Güncellemeyi o noktada çalıştırmayın.

WHERE koşulunun önemi

WHERE koşulu olmadan çalışan bir UPDATE, tablodaki tüm satırları değiştirir. Bu davranış bazen bilinçli olarak istenir; ancak çoğu zaman istenmeyen veri kaybına yol açar. Koşulu her zaman birincil anahtar veya dar bir filtre üzerinden kurun.

  • Birincil anahtar (MusteriID gibi) en güvenli filtre alanıdır.
  • Metin karşılaştırmalarında büyük/küçük harf davranışı harmanlama (collation) ayarına bağlıdır.
  • NULL değerler = ile karşılaştırılmaz; IS NULL kullanılır.
  • Geniş tarih aralıkları yerine mümkün olduğunca dar aralık seçin.

Birden fazla alanı güncelleme

SET ifadesinde birden fazla sütunu virgülle ayırarak aynı anda güncelleyebilirsiniz. Değerler tek bir UPDATE içinde atanır; bu nedenle tutarlılık korunur.

Çok sütunlu güncelleme

-- Önce hedef satırı doğrulayın
SELECT MusteriID, Ad, Soyad, Sehir, Puan
FROM Musteriler
WHERE MusteriID = 3;

-- Sonra güncelleyin
UPDATE Musteriler
SET Sehir = N'İstanbul',
    Puan  = 250
WHERE MusteriID = 3;

Aynı sütunu iki kez SET içinde kullanmayın. Bu durum belirsiz sonuç üretir ve genellikle hata olarak değerlendirilir.

NULL ve metin/sayı değerleri

Bir sütunu NULL yapmak için SET sütun = NULL yazın. Metin değerleri tek tırnak içinde verilir; sayısal değerler tırnaksız yazılır. Tarih değerlerinde ISO biçimi (YYYY-AA-GG) karışıklığı azaltır.

NULL ve farklı veri türleri

-- Önce doğrulayın
SELECT MusteriID, Sehir, Puan, KayitTarihi
FROM Musteriler
WHERE MusteriID = 4;

-- Sonra güncelleyin
UPDATE Musteriler
SET Sehir       = N'Antalya',
    Puan        = NULL,
    KayitTarihi = '2024-05-01'
WHERE MusteriID = 4;

NULL değerleri filtrelemek için WHERE Puan IS NULL veya WHERE Puan IS NOT NULL kullanın. = NULL karşılaştırması beklediğiniz sonucu vermez.

İşlem (transaction) ile kontrollü çalışma

Üretim verisinde UPDATE çalıştırmadan önce işlemi BEGIN TRANSACTION içinde deneyin. Sonucu doğruladıktan sonra COMMIT ile kalıcı hale getirin. Beklenmeyen bir durumda ROLLBACK ile değişiklikleri geri alın.

  1. BEGIN TRANSACTION yazarak işlemi başlatın.
  2. Aynı WHERE koşuluyla SELECT çalıştırıp hedef satırları doğrulayın.
  3. UPDATE ifadesini çalıştırın.
  4. Etkilenen satır sayısını @@ROWCOUNT ile kontrol edin.
  5. Sonucu SELECT ile tekrar okuyun.
  6. Beklenen sonuç doğruysa COMMIT TRANSACTION ile onaylayın.
  7. Sonuç yanlışsa ROLLBACK TRANSACTION ile geri alın.

Transaction içinde güvenli güncelleme

BEGIN TRANSACTION;

-- 1) Hedefi doğrula
SELECT MusteriID, Ad, Soyad, Puan
FROM Musteriler
WHERE Sehir = N'Ankara';

-- 2) Güncelle
UPDATE Musteriler
SET Puan = Puan + 10
WHERE Sehir = N'Ankara';

-- 3) Etkilenen satır sayısını kontrol et
SELECT @@ROWCOUNT AS EtkilenenSatir;

-- 4) Sonucu doğrula
SELECT MusteriID, Ad, Soyad, Puan
FROM Musteriler
WHERE Sehir = N'Ankara';

-- 5) Doğruysa onayla, değilse geri al
-- COMMIT TRANSACTION;
-- ROLLBACK TRANSACTION;

COMMIT veya ROLLBACK satırlarından yalnızca birini etkinleştirin. İkisini aynı anda çalıştırmayın.

@@ROWCOUNT ve doğrulama

@@ROWCOUNT, en son çalışan ifadenin etkilediği satır sayısını döndürür. UPDATE sonrasında bu değeri hemen okuyun. Beklediğinizden fazla satır etkilendiyse işlemi geri alın.

  • Beklenen satır sayısı 1 ise @@ROWCOUNT değeri 1 olmalıdır.
  • 0 dönerse WHERE koşulu hiçbir satırla eşleşmemiştir.
  • Beklenenden büyük bir değer, WHERE koşulunun çok geniş olduğunu gösterir.
  • @@ROWCOUNT değerini başka bir ifade çalıştırmadan hemen okuyun.

Yaygın hatalar ve güvenlik

  • WHERE koşulunu unutmak: tablodaki tüm satırlar güncellenir.
  • Üretim verisinde yedek almadan çalışmak: geri dönüş zorlaşır.
  • Test ortamı yerine doğrudan üretimde denemek: gerçek veri bozulabilir.
  • Uygulama kodunda kullanıcı girdisini doğrudan sorguya eklemek: SQL enjeksiyonu riski.
  • Geniş kapsamlı UPDATE'i yoğun saatlerde çalıştırmak: kilitlenme ve performans sorunları.
  • COMMIT ve ROLLBACK'i aynı betikte birlikte bırakmak: beklenmeyen sonuçlar.

Uygulama tarafında parametreli sorgular kullanın. Kullanıcıdan gelen değerleri doğrudan metin birleştirme ile sorguya eklemeyin. Bu yaklaşım hem güvenliği hem de tutarlılığı artırır.

Beklenen sonuç ve geri alma

Doğru çalışan bir UPDATE, yalnızca WHERE koşuluna uyan satırları değiştirir. Diğer satırlar aynı kalır. İşlem sonrasında SELECT ile sonucu okuyup beklediğiniz değerleri doğrulayın.

Transaction içinde çalıştıysanız ve sonuç yanlışsa ROLLBACK TRANSACTION ile değişiklikleri geri alın. Transaction dışında çalıştıysanız geri alma yalnızca yedekten dönüş veya noktasal kurtarma ile mümkündür. Bu nedenle üretim verisinde önce yedek alın.

Sık yapılan hataların çözümü

  • Tüm satırlar güncellendi: WHERE koşulunu ekleyip işlemi yedekten geri alın.
  • 0 satır etkilendi: WHERE koşulundaki değerleri ve veri türlerini kontrol edin.
  • NULL filtresi çalışmıyor: = NULL yerine IS NULL kullanın.
  • Metin karşılaştırması beklenmedik sonuç veriyor: harmanlama ayarını inceleyin.
  • Kilitlenme hatası alıyorsunuz: işlemi daha dar kapsamda ve düşük yoğunlukta çalıştırın.

Sık sorulan sorular

SQL UPDATE komutunda WHERE koşulu zorunlu mu?

Sözdizimsel olarak zorunlu değildir. Ancak WHERE olmadan çalıştırılan bir UPDATE, tablodaki tüm satırları günceller. Bu nedenle neredeyse her durumda WHERE kullanmanız önerilir.

Güncellemeden önce etkilenecek satırları nasıl görürüm?

UPDATE ile aynı WHERE koşulunu kullanan bir SELECT çalıştırın. Dönen satırlar, güncellemenin etkileyeceği satırlardır. Sonuç beklediğiniz gibiyse UPDATE ifadesini çalıştırın.

Yanlışlıkla tüm satırları güncelledim, geri alabilir miyim?

İşlem bir transaction içinde çalıştıysa ve henüz COMMIT yapılmadıysa ROLLBACK ile geri alabilirsiniz. Transaction dışında çalıştıysa geri alma yalnızca yedekten dönüş veya noktasal kurtarma ile mümkündür.

Bir sütunu NULL yapmak için ne yazmalıyım?

SET sütun = NULL yazmanız yeterlidir. NULL değerleri filtrelemek için WHERE sütun IS NULL veya WHERE sütun IS NOT NULL kullanın; = NULL karşılaştırması beklenen sonucu vermez.

Kaç satırın etkilendiğini nasıl öğrenirim?

UPDATE ifadesinden hemen sonra SELECT @@ROWCOUNT çalıştırın. Bu değer, en son ifadenin etkilediği satır sayısını verir. Değeri başka bir ifade çalıştırmadan hemen okumalısınız.

Birden fazla sütunu tek UPDATE ile güncelleyebilir miyim?

Evet. SET ifadesinde sütunları virgülle ayırarak birden fazla sütunu aynı UPDATE içinde güncelleyebilirsiniz. Aynı sütunu iki kez yazmayın.

Resmî kaynaklar

20940 Puan