DELETE mi TRUNCATE mı? Satır Silmek ile Tabloyu Boşaltmanın Farkı
Karşılaştırma

DELETE mi TRUNCATE mı? Satır Silmek ile Tabloyu Boşaltmanın Farkı

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 5 dk okuma

DELETE seçtiğiniz satırları tek tek siler, TRUNCATE tablonun tamamını tek hamlede boşaltır, DROP ise tabloyu yapısıyla birlikte kaldırır. Hangisinin geri alınabileceği, tetikleyici çalıştırıp çalıştırmadığı ve kimlik sayacına ne yaptığı veritabanına göre değişir.

Bir bakışta

  1. Koşullu silme gerekiyorsa tek seçenek DELETE'tir. TRUNCATE WHERE koşulu almaz; tablonun ya da bölümün tamamını boşaltır.
  2. TRUNCATE hızlıdır, çünkü satırları tek tek işlemez. PostgreSQL tabloyu taramaz; SQL Server yalnız sayfa serbest bırakmalarını günlüğe yazar.
  3. Geri alınabilirlik veritabanına göre değişir. PostgreSQL ve SQL Server'da işlem içinde geri alınır; MySQL'de örtük commit yapar ve geri alınamaz.
  4. TRUNCATE satır silme tetikleyicilerini çalıştırmaz. Denetim kaydı ya da bağlı tablo güncellemesi tetikleyiciye dayanıyorsa DELETE kullanılmalıdır.
  5. DROP veriyle birlikte tablo tanımını da kaldırır. Yapıyı koruyup içeriği boşaltmak için TRUNCATE, nesneyi tümden kaldırmak için DROP kullanılır.

Ortak zemin: üçü de veriyi ortadan kaldırır, ama farklı katmanda

DELETE, TRUNCATE ve DROP sık sık aynı cümlede anılır, çünkü üçü de veriyi kaldırır. Fark, neyin kaldırıldığında ve bunun nasıl yapıldığındadır.

DELETE satır düzeyinde çalışır. WHERE koşuluyla hangi satırların silineceğini seçersiniz; koşul yazılmazsa tüm satırlar silinir. Tablonun yapısı, sütunları, indeksleri ve kısıtları yerinde kalır.

TRUNCATE tablonun tamamını boşaltır. SQL Server belgeleri onu WHERE koşulu olmayan bir DELETE'e benzetir, ancak daha hızlı olduğunu ve daha az sistem ve işlem günlüğü kaynağı kullandığını belirtir. Tablo yapısı burada da korunur.

DROP ise tabloyu tanımıyla birlikte kaldırır. SQL Server belgeleri bunu açıkça ayırır: tablo tanımını da verilerle birlikte kaldırmak için DROP TABLE kullanılır.

Ölçüt ölçüt farklar

  • Ölçüt: Kapsam. DELETE: WHERE ile seçilen satırlar ya da tümü. / TRUNCATE: tablonun tamamı; SQL Server'da bölümlenmiş tabloda seçilen bölümler.
  • Ölçüt: Nasıl çalışır. DELETE: satırları tek tek siler; SQL Server her silinen satır için günlüğe kayıt yazar. / TRUNCATE: PostgreSQL tabloyu taramaz; SQL Server veri sayfalarını serbest bırakır ve yalnız bunu günlüğe yazar.
  • Ölçüt: Tetikleyiciler. DELETE: satır silme tetikleyicilerini çalıştırır. / TRUNCATE: çalıştırmaz; PostgreSQL ayrıca tanımlanmış TRUNCATE tetikleyicilerini çalıştırır.
  • Ölçüt: Kimlik sayacı. DELETE: sayaç kaldığı yerden devam eder. / TRUNCATE: SQL Server'da ve MySQL'de başlangıç değerine döner; PostgreSQL'de varsayılan olarak devam eder, RESTART IDENTITY ile sıfırlanır.
  • Ölçüt: Yabancı anahtarlar. DELETE: başka tablolardan başvurulan satırlar kısıt kurallarına göre silinir ya da engellenir. / TRUNCATE: SQL Server ve MySQL InnoDB, başka tablolardan başvurulan tabloyu boşaltmayı reddeder; PostgreSQL'de varsayılan RESTRICT'tir, CASCADE başvuran tabloları da boşaltır.
  • Ölçüt: Kilitleme. DELETE: satır düzeyinde kilitle eşzamanlı erişime izin verebilir. / TRUNCATE: PostgreSQL'de tabloda tüm erişimi engelleyen ACCESS EXCLUSIVE kilidi alır; SQL Server'da tablo ve şema kilidi alır.
  • Ölçüt: Yetki. DELETE: tabloda DELETE yetkisi. / TRUNCATE: PostgreSQL'de TRUNCATE yetkisi, SQL Server'da en az ALTER, MySQL'de DROP yetkisi.
Şekil 1

Satır, içerik, nesne: üç komut üç ayrı katmanda çalışır

DELETETRUNCATEDROP
Ne kaldırılırSeçilen satırlarTüm satırlarTablo ve tanımı
WHERE koşuluAlırAlmazAlmaz
Tablo yapısıKalırKalırKaldırılır
Silme tetikleyicisiÇalışırÇalışmazÇalışmaz
Kimlik sayacıDevam ederÇoğunlukla sıfırlanır (PostgreSQL'de seçime bağlı)Tabloyla birlikte gider
İşlem içinde geri almaMümkünPostgreSQL ve SQL Server'da mümkün, MySQL'de değilVeritabanına göre değişir
Kaynak: PostgreSQL, SQL Server ve MySQL resmî belgelerine dayanan sayfa içeriğiMindset Institute

Geri alma: en çok yanlış bilinen fark

Yaygın inanış, TRUNCATE'in hiçbir koşulda geri alınamayacağıdır. Bu, veritabanına göre değişir.

PostgreSQL belgelerine göre TRUNCATE tablolardaki veri açısından işlem güvenlidir: çevreleyen işlem onaylanmazsa boşaltma güvenle geri alınır. SQL Server belgeleri de TRUNCATE TABLE işleminin bir işlem içinde geri alınabileceğini yazar ve bunu BEGIN TRANSACTION, TRUNCATE, ROLLBACK sırasıyla gösterir.

MySQL'de durum farklıdır. MySQL belgeleri TRUNCATE TABLE'ı DML değil DDL komutu olarak sınıflar; komut örtük commit yapar ve bu yüzden geri alınamaz.

PostgreSQL'de bir uyarı daha vardır: TRUNCATE çoklu sürüm eşzamanlılık denetimi (MVCC) açısından güvenli değildir. Boşaltmadan önce alınmış bir anlık görüntüyle çalışan eşzamanlı işlemler, tabloyu boş görür.

Sonuç: DELETE, işlem destekleyen tablolarda (MySQL'de InnoDB gibi) üç veritabanında da işlem içinde geri alınabilir. TRUNCATE'e güvenmeden önce kullandığınız veritabanının davranışını bilin; üretim ortamında her iki komuttan önce yedek ya da kopya alınması yine de doğru alışkanlıktır.

Güvenli toplu silme nasıl yapılır?

Büyük bir tablodan veri temizlemek gerektiğinde komut seçimi kadar uygulama sırası da önemlidir. Pratikte işleyen sıra şöyledir:

  • Kapsamı sayın. Silinecek satırları önce SELECT COUNT ile aynı WHERE koşuluyla sayın; beklediğinizle uyuşmuyorsa koşul yanlıştır.
  • Bağımlılıkları kontrol edin. Tabloya başvuran yabancı anahtarlar, silme tetikleyicileri ve tabloyu okuyan raporlar listelenir. Tetikleyiciye dayanan bir denetim kaydı varsa TRUNCATE seçeneği düşer.
  • Komutu seçin. Koşullu silme gerekiyorsa DELETE; tablonun tamamı boşalacaksa, başvuran tablo yoksa ve tetikleyici gerekmiyorsa TRUNCATE.
  • İşlem içinde çalıştırın. DELETE'i ve veritabanınız destekliyorsa TRUNCATE'i bir işlemin içinde çalıştırın, sonucu doğrulayıp ardından onaylayın.
  • Sonrasını doğrulayın. Satır sayısını, kimlik sayacının durumunu ve bağlı raporları kontrol edin.

Çok büyük bir tablodan koşullu silme yapılıyorsa DELETE işlemini parçalara bölmek, uzun süren kilitleri ve günlük şişmesini sınırlar.

Şekil 2

Silmeden önce say, bağımlılığı gör, işlem içinde çalıştır

  1. Kapsamı sayAynı WHERE koşuluyla SELECT COUNT çalıştırın.
  2. Bağımlılıkları kontrol etYabancı anahtarlar, silme tetikleyicileri, tabloyu okuyan raporlar.
  3. Komutu seçKoşullu silmede DELETE, tam boşaltmada koşullar uygunsa TRUNCATE.
  4. İşlem içinde çalıştırSonucu doğrulayıp ardından onaylayın.
  5. Sonrasını doğrulaSatır sayısı, kimlik sayacı ve bağlı raporlar.
Kaynak: Sayfa içeriğiMindset Institute

Hangi durumda hangisi?

DELETE kullanın: • Yalnız belirli satırlar silinecekse: eski kayıtlar, test verisi, mükerrer satırlar. • Silme tetikleyicileri çalışmalıysa; örneğin her silme bir denetim tablosuna yazılıyorsa. • Tablo başka tablolardan yabancı anahtarla başvuruluyorsa ve kısıt kurallarının satır satır uygulanması gerekiyorsa. • Silme sırasında başka kullanıcılar tabloyu okumaya ve yazmaya devam edecekse.

TRUNCATE kullanın: • Hazırlık (staging) tablosu her yüklemeden önce tamamen boşaltılıyorsa. • Test ortamında tablo temiz başlangıca döndürülecekse ve kimlik sayacının sıfırlanması isteniyorsa. • Tablo büyükse ve tamamı gidecekse; hız ve günlük kullanımı belirgin biçimde iyileşir.

DROP kullanın: • Tablo artık hiç kullanılmayacaksa ya da yeniden farklı bir yapıyla oluşturulacaksa. DROP sonrası tabloya bağlı görünümler, yetkiler ve kod da etkilenir; önce bu bağımlılıklar gözden geçirilir.

Sık yapılan hatalar

  • WHERE koşulunu unutmak. DELETE FROM siparisler satırı tablonun tamamını siler. Koşulu önce SELECT ile denemek ve DELETE'i işlem içinde çalıştırmak bu kazanın en etkili önlemidir.
  • TRUNCATE'in her yerde geri alınabileceğini ya da hiçbir yerde geri alınamayacağını varsaymak. Davranış veritabanına göre değişir; MySQL'de komut örtük commit yapar.
  • Kimlik sayacının sıfırlanmasını gözden kaçırmak. Başka sistemlerin eski kimlik değerlerine başvurduğu durumlarda sayacın başa dönmesi çakışmalara yol açabilir. PostgreSQL'de sayacı korumak varsayılandır; SQL Server'da sayacı korumak için belgeler DELETE kullanmayı önerir.
  • PostgreSQL'de CASCADE seçeneğini düşünmeden kullanmak. Belgeler bu seçenekte çok dikkatli olunmasını, aksi halde silinmesi istenmeyen verinin kaybedilebileceğini vurgular.
  • Yoğun saatte büyük tabloyu TRUNCATE etmek. Komut tabloda tüm erişimi engelleyen bir kilit alır; tabloyu okuyan uygulamalar bekler.

Mindset programlarında nerede çalışılır?

Bu ayrım, rapor tablolarını yöneten analistler, yükleme süreçleri yazan veri ekipleri ve veritabanı yöneticileri için gündelik bir karardır. SQL ile Programlama Eğitimi tablolarla çalışmayı ve veri işleme dilini sorgularla birlikte işler. Veritabanı Yönetim Sistemleri ve Uygulamaları eğitimi ise veritabanı yönetimi, güvenlik ve yetkilendirme başlıklarıyla bu komutların yetki ve işletim tarafını ele alır.

İlgili Mindset programı

SQL ile Programlama Eğitimi

Sık sorulanlar

Sık sorulan sorular

TRUNCATE ile tek bir bölüm (partition) boşaltılabilir mi?

SQL Server'da evet: TRUNCATE TABLE komutuna WITH PARTITIONS seçeneği eklenerek yalnız belirtilen bölümler boşaltılır; bunun için tablo ve indekslerinin aynı bölümleme fonksiyonuyla hizalı olması gerekir. PostgreSQL'de ise bölümün kendisi bir tablo olduğundan doğrudan o bölüm boşaltılabilir; belgelere göre bu durumda kardeş bölümlere dokunulmaz, ama başvuran tablolara basamaklama yine uygulanır.

DELETE sonrası disk alanı neden hemen boşalmıyor?

PostgreSQL'de DELETE satırları ölü satır olarak işaretler; alanın yeniden kullanılabilir hale gelmesi için VACUUM işlemi gerekir. TRUNCATE ise belgelere göre alanı hemen geri kazanır. SQL Server'da da DELETE sonrasında tabloda boş sayfalar kalabilir ve bunları bir arka plan süreci temizler; TRUNCATE ise tablo ve indekslerinde hiç sayfa bırakmaz.

TRUNCATE neden yetki hatası veriyor?

Gereken yetki DELETE'ten farklıdır. PostgreSQL tabloda ayrı bir TRUNCATE yetkisi ister. SQL Server en az ALTER yetkisi ister ve bu yetki varsayılan olarak tablo sahibinde ve belirli yönetici rollerindedir. MySQL ise DROP yetkisi ister. Uygulama hesabına geniş yetki vermek yerine, boşaltma işlemini yetkili bir saklı yordama koymak daha güvenli bir yoldur.

Tabloyu boşaltıp yeniden yüklemek için TRUNCATE mi, DROP ve CREATE mi?

Yapı aynı kalacaksa TRUNCATE daha güvenlidir: tablo tanımı, indeksler, kısıtlar ve verilen yetkiler korunur. DROP ve ardından CREATE, tabloya bağlı yetkilerin ve kimi nesnelerin yeniden tanımlanmasını gerektirir; bir adım unutulursa raporlar kırılır. Yapı değişecekse bu yol bilinçli olarak seçilir ve değişiklik bir şema migrasyonu olarak yönetilir.

DELETE ve TRUNCATE Farkı: SQL'de Hangisi Ne Zaman?