Veri Silme (DELETE, TRUNCATE)

Kayıtları silme ve tablo temizleme

Temel DELETE

-- Tek kayıt silme
DELETE FROM users WHERE id = 10;

-- Koşullu silme
DELETE FROM products WHERE stock = 0 AND is_active = FALSE;
WHERE olmadan DELETE tüm tabloyu siler! Her zaman önce SELECT ile kontrol edin.

Tarih Bazlı Silme

-- 30 günden eski logları sil
DELETE FROM logs WHERE created_at < NOW() - INTERVAL '30 days';

-- Geçen yılın verilerini sil
DELETE FROM analytics WHERE year = 2022;

-- Belirli tarih aralığını sil
DELETE FROM temp_data 
WHERE created_at BETWEEN '2024-01-01' AND '2024-01-31';

RETURNING ile Silme

-- Silinen kayıtları döndür (log için)
DELETE FROM products WHERE stock = 0
RETURNING id, name, sku;

-- Silinen kayıt sayısını al
WITH deleted AS (
    DELETE FROM expired_sessions 
    WHERE expires_at < NOW() 
    RETURNING id
)
SELECT COUNT(*) AS deleted_count FROM deleted;
id | name | sku ----+-------------+---------- 15 | Old Product | SKU-015 23 | Expired | SKU-023

Bağlı Kayıtlarla Silme

-- CASCADE ile (otomatik bağlı kayıtları siler)
DELETE FROM users WHERE id = 5;
-- Bu, orders, comments vb. tüm bağlı kayıtları da siler (FK CASCADE ise)

-- Manuel olarak önce bağlı kayıtları sil
DELETE FROM order_items WHERE order_id = 100;
DELETE FROM orders WHERE id = 100;

TRUNCATE - Hızlı Tablo Temizleme

-- Tüm verileri sil (WHERE desteklemez)
TRUNCATE TABLE logs;

-- SERIAL/IDENTITY sıfırla
TRUNCATE TABLE logs RESTART IDENTITY;

-- Bağlı tabloları da temizle
TRUNCATE TABLE orders CASCADE;

-- Birden fazla tablo
TRUNCATE TABLE logs, temp_data, cache RESTART IDENTITY;
ÖzellikDELETETRUNCATE
WHERE koşulu✅ Destekler❌ Desteklemez
Hız⚠️ Yavaş (log tutar)✅ Çok hızlı
Transaction✅ Rollback edilebilir✅ Rollback edilebilir
Trigger✅ Çalışır❌ Çalışmaz (BEFORE ile)
IDENTITY reset❌ Sıfırlamaz✅ RESTART IDENTITY ile

Soft Delete Yaklaşımı

-- Fiziksel silme yerine mantıksal silme
UPDATE users SET
    deleted_at = NOW(),
    is_active = FALSE,
    email = email || '_deleted_' || id
WHERE id = 10;

-- Soft delete'den geri getirme
UPDATE users SET
    deleted_at = NULL,
    is_active = TRUE,
    email = REPLACE(email, '_deleted_' || id, '')
WHERE id = 10;