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;
| Özellik | DELETE | TRUNCATE |
|---|---|---|
| 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;