DELETE ve TRUNCATE - her ikisi de tabloları temizlemek için araçlardır, ancak farklı çalışırlar:
İnce Noktalar:
ROLLBACK) desteği sunar, TRUNCATE - hayır ya da DBMS'ye bağlıdır.Örnek:
-- 3 yıldan eski siparişleri sil DELETE FROM orders WHERE created_at < CURRENT_DATE - INTERVAL '3 years'; -- Tabloyu tamamen temizlemek (hızlı) TRUNCATE TABLE logs;
TRUNCATE sonrası veriler geri alınabilir mi?
Tipik bir hata: DELETE gibi TRUNCATE'ın da işlem içerisinde geri alınabileceğini düşünmek. Ancak TRUNCATE genellikle geri alınamaz veya UNDO yapılamaz, yalnızca bazı DBMS'ler (örneğin, PostgreSQL işlem içinde çalışırken).
Örnek (çoğu DBMS'de):
BEGIN; TRUNCATE TABLE orders; ROLLBACK; -- Çoğu DBMS'de çalışmaz, veriler kayboldu!
Hikaye
Üretim veritabanında TEST yerine TRUNCATE ile geçici verilerin silinmesi. Silme işlemi için tetikleyici sadece DELETE üzerinde çalıştı — kaybolan veriler, zaman ve kullanıcı bilgisi yok. Olay çözümü zarar gördü.
Hikaye
Dış anahtarın bulunduğu tabloda TRUNCATE ile temizleme. SQL, referans bütünlüğü kısıtlaması nedeniyle hata verdi, script tamamlanmadı, otomasyon durdu. Çözüm: dış anahtarları geçici olarak kaldırmak veya DELETE kullanmak.
Hikaye
Büyük tablolarda DELETE ile toplu veri silme işlemi: uzun süreli kilitler nedeniyle veritabanı "dondu", diğer işlemler kilitlerin serbest bırakılmasını bekledi. Sonuç — sistemin durması. Doğru: destekleniyorsa DELETE LIMIT/OFFSET kullanmak veya toplu işlemler.