SQL’de DELETE vs TRUNCATE vs DROP: Farklılıklar, Geri Alma ve Her Biri Ne Zaman Kullanılmalı

  1. Ana sayfa
  2. Blog
  3. Veritabanları ve SQL

Veritabanları ve SQL

DELETE vs TRUNCATE vs DROP: Farklılar, Geri Alma ve Her Birinin Ne Zaman Kullanılacağı

Her üç komut da bir şeyi kaldırır, ancak farklı şeyleri farklı şekillerde kaldırırlar. Her birinin ne yaptığını, neleri geri alabileceğinizi ve kuralların veritabanları arasında nasıl değiştiğini burada bulabilirsiniz.

8 dk okuma
SQL'de DELETE vs TRUNCATE vs DROP: farklar, geri alma ve her birinin ne zaman kullanılacağı

Önemli noktalar

  • DELETE, isteğe bağlı olarak WHERE ile filtrelenen satırları kaldırır. Masa kalıyor.
  • TRUNCATE tüm satırları hızla kaldırır. Tablo yapısı kalır.
  • DROP tablonun tamamını kaldırır: veriler, yapı, dizinler ve tetikleyiciler.
  • Geri alma, tetikleyiciler ve kimlik sıfırlama her veritabanında farklı şekilde davranır; bu nedenle kendinizinkini kontrol edin.

Bir test uzmanı, yeni bir test çalıştırmasından önce hazırlama masasını temizlemek istiyor. DELETE, TRUNCATE veya DROP mü olmalı? Yanlış seçim yavaş bir iş, eksik bir masa veya üretimde çok kötü bir öğleden sonra anlamına gelebilir.

Aşağıdaki DELETE ve DROP örneklerini SQLite 3.50’de çalıştırdık ve çıktılar bu çalıştırmadan geliyor. SQLite’ta TRUNCATE komutu yoktur, dolayısıyla TRUNCATE notları kendi testimiz yerine resmi PostgreSQL, MySQL ve SQL Server belgelerine dayanmaktadır.

Kısa cevap

  • Bazı satırları kaldırmanız mı gerekiyor? DELETE ... WHERE‘yi kullanın.
  • Bir masayı boşaltmanız ama saklamanız mı gerekiyor? Desteklendiği yerde TRUNCATE kullanın.
  • Masanın tamamen gitmesi mi gerekiyor? DROP TABLE‘i kullanın.

DELETE: satırları kaldır

DELETE bir veri değiştirme (DML) komutudur. Satırları birer birer kaldırır, satır düzeyindeki tetikleyicileri etkinleştirir ve filtrelenebilir. Denetim tetikleyicisi olan küçük bir tablo oluşturduk:

CREATE TABLE logs (id INTEGER PRIMARY KEY AUTOINCREMENT, level TEXT);
INSERT INTO logs (level) VALUES ('INFO'),('ERROR'),('INFO'),('DEBUG');

CREATE TABLE audit (msg TEXT);
CREATE TRIGGER logs_delete AFTER DELETE ON logs
BEGIN INSERT INTO audit VALUES ('deleted ' || OLD.id); END;

DELETE FROM logs WHERE level = 'DEBUG';

SELECT id, level FROM logs;  -- (1,'INFO'), (2,'ERROR'), (3,'INFO')
SELECT * FROM audit;         -- 'deleted 4'

Yalnızca eşleşen satır gitti ve tetikleyici bunu kaydetti. WHERE yan tümcesi olmadan DELETE FROM logs çalıştırıldığında diğer üç satır kaldırıldı ve denetim tablosu daha sonra silinen satır başına bir tane olmak üzere dört giriş tuttu.

DELETE otomatik artan sayaçları sıfırlamaz. Tabloyu boşalttıktan sonra bir sonraki eklememiz 1 değil id 5 aldı. SQLite’da bunun nedeni AUTOINCREMENT‘dir. MySQL InnoDB ve SQL Server kimlik sütunları da DELETE sonrasında oldukları yerden devam eder.

İpucu: WHERE yan tümcesine sahip herhangi bir DELETE öncesinde, ilk olarak SELECT COUNT(*) ile aynı yan tümceyi çalıştırın. Sayım sizi şaşırtırsa durun. NULL’un WHERE yan tümcesinde oluşturduğu tuzaklar için SQL NULL değerlerine ilişkin kılavuzumuzu okuyun.

TRUNCATE: tabloyu boşalt

TRUNCATE TABLE logs; her satırı aynı anda kaldırır. WHERE yan tümcesini alamaz. Veritabanı, satırları tek tek silmek yerine genellikle tablonun veri sayfalarını serbest bırakır; bu nedenle büyük tablolarda çok daha hızlıdır.

SQLite’da çalıştırdığımızda bir sözdizimi hatasıyla karşılaştık çünkü SQLite’da şu komut yok:

TRUNCATE TABLE logs;
-- near "TRUNCATE": syntax error

SQLite’ta WHERE yan tümcesi olmadan DELETE FROM logs; kullanın. SQLite’ın belgeleri, tablonun tetikleyicisi olmadığında bunu hızlandıran bir “kesilmiş optimizasyonu” açıklar. Masamızın bir tetikleyicisi vardı, bu nedenle silme işlemi satır satır yürütüldü ve her satır için tetiklendi.

TRUNCATE’i destekleyen veritabanlarında, belgelerine göre:

  • Normalde satır düzeyinde DELETE tetikleyicilerini etkinleştirmez.
  • Genellikle kimlik veya otomatik artış sayaçlarını sıfırlar, örneğin MySQL ve SQL Server’da. PostgreSQL’de RESTART IDENTITY eklersiniz.
  • Çoğu sistemde DELETE’den daha güçlü izinlere ihtiyaç duyar.

DROP: tablonun kendisini kaldır

DROP TABLE bir şema (DDL) komutudur. Verileri, tablo tanımını, dizinlerini, tetikleyicilerini ve kısıtlamalarını kaldırır. Görünümler veya yabancı anahtarlar gibi tabloya atıfta bulunan her şey de etkilenir.

DROP TABLE logs;
SELECT * FROM logs;
-- no such table: logs

DROP TABLE IF EXISTS logs;  -- no error, even though it is gone

IF EXISTS birden fazla çalıştırılabilecek kurulum komut dosyalarında kullanışlıdır. SQL görünümlerinin açıklanmasında gösterdiğimiz gibi, bırakılan bir tablodaki görünümler bozulabilir.

Karşılaştırma tablosu

Özellik SİL KES DAMLA
Kaldırır Satırların bir kısmı veya tamamı Tüm satırlar Tablo ve satırlar
WHERE yan tümcesi Evet Hayır Hayır
Komut türü DML DDL (genellikle) DDL
Sıra yangını tetikliyor Evet Genellikle hayır Hayır
Kimliği sıfırlar Hayır Genellikle evet Masa gitti
Büyük masalarda hız Yavaş Hızlı Hızlı
Tablo kalır Evet Evet Hayır

Geri dönebilir misin?

Pek çok makalenin aşırı basitleştirildiği yer burasıdır. Dürüst cevap, veritabanına bağlı olmasıdır.

DELETE işlemi her yerde bir işlemin içinde geri alınabilir. Bunu test ettik:

BEGIN;
DELETE FROM logs;
SELECT COUNT(*) FROM logs;  -- 0
ROLLBACK;
SELECT COUNT(*) FROM logs;  -- 3

DROP ayrıca işlemsel DDL’yi destekleyen SQLite’ta da geri alındı:

BEGIN;
DROP TABLE logs;
ROLLBACK;
SELECT COUNT(*) FROM logs;  -- 1 (the table is back)

Diğer veritabanlarındaki TRUNCATE ve DROP için belgelerine göre:

Veritabanı Bir işlemde TRUNCATE / DROP
PostgreSQL Geri sarılabilir. DDL işlemseldir.
SQL Sunucusu Açık bir işlem içinde geri alınabilir.
MySQL Örtülü bir işleme neden olur, bu nedenle geri alınamaz.
Kahin Örtük olarak taahhüt eder. DROP geri dönüşüm kutusundan kurtarılabilir.

Dolayısıyla “TRUNCATE asla geri alınamaz” PostgreSQL ve SQL Server için yanlıştır ve “her zaman geri alınabilir” MySQL için yanlıştır. Bir işlem dışında hiçbiri yedekleme olmadan geri alınamaz.

TRUNCATE neden hızlıdır?

DELETE, değişikliğin geri alınabilmesi ve çoğaltılabilmesi için kaldırılan her satırı günlüğe kaydeder, tetikleyicileri etkinleştirir ve kısıtlamaları satır satır kontrol eder. Milyonlarca satırın bulunduğu bir tabloda bu, çok fazla iş ve günlük hacmi yaratır. TRUNCATE genellikle depolamayı tek bir işlemde serbest bırakır ve çok daha az günlüğe kaydeder. Her şey yerine büyük bir alt kümeyi kaldırmak istiyorsanız toplu olarak silin, böylece uzun kilitlenmelerden kaçınırsınız. SQL sorgu optimizasyonunda kilitleme ve sorgu maliyetini ele alıyoruz.

Yabancı anahtarlar ve izinler

  • Yabancı anahtarlar. SQL Server, yabancı bir anahtar tarafından başvurulan bir tabloyu KESMEYİ reddeder. PostgreSQL, referans tablolarını da kesmenizi veya CASCADE kullanmanızı gerektirir. DELETE bunun yerine her satırı kısıtlamalara göre kontrol eder.
  • İzinler. DELETE, silme haklarına ihtiyaç duyar. TRUNCATE genellikle ALTER’a veya özel bir TRUNCATE hakkına ihtiyaç duyar ve DROP’un şemada sahipliğe veya ALTER’a ihtiyacı vardır.
  • Çoğaltma ve denetim. Diğer sistemler satır düzeyindeki değişiklik günlüklerine veya tetikleyicilere bağlıysa TRUNCATE bunları atlayabilir. Önce bu sistemlerin sahibi kim olursa olsun ona danışın.

Hangisini kullanmalı

Durum Kullanım
Müşterinin iptal edilen siparişlerini kaldırma WHERE ile SİL
Her test çalıştırmasından önce hazırlama tablosunu sıfırlayın TRUNCATE (veya SQLite’da DELETE)
Denetim tetikleyicilerinin çalışır durumda kalmasını sağlayın SİL
Artık tasarımda olmayan bir tabloyu kaldırın İncelenen bir geçişte DROP
Milyonlarca eski satırı temizleyin ancak son satırları koruyun Toplu olarak SİLİN veya eski bölümleri bölümleyip bırakın

Test verileri için TRUNCATE popülerdir çünkü kimlikleri sıfırlar, bu da testleri tekrarlanabilir hale getirir. Her testi geri alınan bir işleme sarmak, SQL işlemleri ve ACID‘de açıklanan başka bir seçenektir.

Güvenlik kontrol listesi

  1. Hangi veritabanına ve ortama bağlı olduğunuzu doğrulayın.
  2. Önce WHERE yan tümcesini SELECT olarak çalıştırın.
  3. Değişikliği veritabanınızın desteklediği bir işleme sarın.
  4. Üretimde TRUNCATE veya DROP öncesinde yeni, test edilmiş bir yedeklemeye sahip olun.
  5. DROP ifadelerini, asla geçici konsollara değil, incelenen geçiş komut dosyalarına koyun.
  6. Bir tabloyu bırakmadan önce görünümler, yabancı anahtarlar ve raporlar gibi tabloya neyin bağlı olduğunu kontrol edin.

Büyük miktarda veriyi güvenli bir şekilde silme

Milyonlarca satırın tek bir DELETE ile kaldırılması tabloyu uzun süre kilitleyebilir, işlem günlüğünü doldurabilir ve çoğaltmayı yavaşlatabilir. Yaygın bir model, küçük gruplar halinde silmek ve hiçbir şey kalmayana kadar tekrar etmektir:

-- SQL Server style (not run for this article)
DELETE TOP (5000) FROM logs WHERE created_at < '2026-01-01';

-- PostgreSQL style (not run for this article)
DELETE FROM logs
WHERE id IN (SELECT id FROM logs WHERE created_at < '2026-01-01' LIMIT 5000);

İfadeyi, sıfır satır rapor edene kadar gruplar arasında kısa bir duraklamayla bir döngüde çalıştırın. Her parti küçük bir işlem olduğundan kilitler kısadır ve diğer sorgular çalışmaya devam eder. Buradaki created_at filtre sütunundaki bir dizin, her partinin hızlı olmasını sağlar.

Günlükler ve etkinlikler gibi tarihe göre büyüyen veriler için tablo bölümleme daha da iyidir. Her ay kendi bölümünde bulunur ve eski verileri kaldırmak, satırları birer birer silmek yerine bir bölümü düşüren veya kesen hızlı bir işlem haline gelir.

Geçici silme

Birçok uygulama iş kayıtlarını hiçbir zaman fiziksel olarak silmez. deleted_at gibi bir sütun ekleyip onun yerine onu ayarlarlar ve sorgular daha sonra deleted_at IS NULL üzerinden filtrelenir. Geçici silmeler, kurtarmayı kolaylaştırır ve denetim geçmişini saklar, ancak her sorgunun filtreyi hatırlaması gerekir; bu, görüntüleme için iyi bir iştir. Geçici olarak silinen bir satır hala değerini koruduğu için benzersiz kısıtlamalara da dikkat edilmesi gerekir. Gizlilik yasaları, kişisel verilerin bir süre sonra gerçekten silinmesini gerektirebilir; bu nedenle geçici silmeler, saklama politikasının yerine geçmez.

Son sözler

DELETE hassas ve dikkatli bir araçtır. TRUNCATE hızlı sıfırlama düğmesidir ve DROP tabloyu tamamen kaldırır. En büyük risk, özellikle geri alma sırasında bir veritabanının diğeri gibi davrandığını varsaymaktır. Şüpheye düştüğünüzde, önce kendi veritabanınızdaki tablonun bir kopyası üzerinde komutu test edin.

Sık sorulan sorular

DELETE ve TRUNCATE arasındaki temel fark nedir?

DELETE satırları birer birer kaldırır, WHERE’ı destekler ve tetikleyicileri tetikler. TRUNCATE tüm satırları aynı anda kaldırır, çok daha hızlıdır, genellikle satır tetikleyicilerini atlar ve sıklıkla kimlik sayaçlarını sıfırlar.

TRUNCATE geri alınabilir mi?

PostgreSQL ve SQL Server’da evet, bir işlemin içinde. MySQL ve Oracle’da örtülü olarak taahhüt edilir, dolayısıyla geri alınamaz.

DELETE otomatik artış değerini sıfırlar mı?

Hayır. DELETE işleminden sonra yeni satırlar önceki sayaçtan devam eder. SQLite testimizde tüm satırları sildikten sonra bir sonraki ID 5 oldu.

SQLite TRUNCATE’i destekliyor mu?

Hayır. WHERE yan tümcesi olmadan DELETE FROM tablosunu kullanın. SQLite, tablonun tetikleyicisi olmadığında bunu optimize eder.

DROP TABLE neyi kaldırır?

Veriler, tablo tanımı, dizinler, tetikleyiciler ve kısıtlamalar. Tabloya bağlı görünümler ve yabancı anahtarlar düşüşü bozabilir veya engelleyebilir.

Öğrenmeye devam et

Stack Quora ile çalışın

Test, WordPress veya SEO konusunda yardıma mı ihtiyacınız var?

Ekiplerin daha iyi yazılımlar sunmasına ve sitelerini büyütmesine yardımcı oluyoruz. Bize ne üzerinde çalıştığınızı söyleyin, biz de bir sonraki adım için net bir öneride bulunalım.

Okumaya devam et

Daha fazla kılavuz test, yapay zeka ve modern geliştirme

Bu makaleyi beğendiniz mi? Bir konu seçin ve doğrudan en yeni eğitimlerimize geçin.

Yapay zekâ

Yapay Zeka Halüsinasyonları Açıklandı: Dil Modelleri Neden İşleri Düzeltiyor ve Nasıl Azaltılabilir?

Yapay zeka halüsinasyonları açıkladı: ne olduklarını, dil modellerinin bunları neden ürettiğini, yaygın türlerini, temellendirme ve yönlendirmelerle…

Makaleyi okuyun →
DevOps

Açıklanan Ortam Değişkenleri: .env Dosyaları, Sırlar ve Yapılandırma Doğru Yapıldı

Çalıştırdığımız Python örnekleriyle açıklanan ortam değişkenleri: bunları okumak ve ayarlamak, neden her değerin bir dize olduğu, .env dosyaları, sü…

Makaleyi okuyun →
Yazılım geliştirme

API Hız Sınırlamasının Açıklaması: Algoritmalar, Başlıklar ve 429 Hatalarının Ele Alınması

API hızı sınırlaması, çalıştırdığımız bir simülasyonla açıklanmıştır: belirteç kümesi, sabit pencere, kayan pencere, 429 yanıt, hız sınırı başlıklar…

Makaleyi okuyun →
Test otomasyonu

Python'da alay etme: Unittest.mock, patch ve Testleri Yalan Yapan Hatalar

Unittest.mock ile Python'da alay etme, test edildi: Sahte ve dönüş_değeri, yan_etki, bir adın kullanıldığı yerde yama uygulama, spesifikasyon ve oto…

Makaleyi okuyun →
Yazılım testi

Kod Kapsamının Açıklaması: Hat ve Şube Kapsamı ve %100'ün Gerçek Anlamı

Kod kapsamı gerçek bir kapsama.py çalışmasıyla açıklanmıştır: hat, şube ve durum kapsamı, bir raporun okunması, %100 kapsamın neden hâlâ hataları ka…

Makaleyi okuyun →
Veritabanları ve SQL

SQL'de DELETE vs TRUNCATE vs DROP: Farklılıklar, Geri Alma ve Her Biri Ne Zaman Kullanılmalı

DELETE vs TRUNCATE vs DROP test edilmiş SQL ile açıklandı: her birinin neyi kaldırdığı, geri aldığı, tetiklediği, kimlik sıfırlaması, hızı ve Postgr…

Makaleyi okuyun →
Veritabanları ve SQL

Açıklanan SQL Görünümleri: Örneklerle Tuzakları Oluşturun, Kullanın ve Önleyin

Çalıştırdığımız sorgularla açıklanan SQL görünümleri: görünüm oluşturma, canlı sonuçlar, sütunları gizleme, performans, güncellenebilir ve gerçekleş…

Makaleyi okuyun →
Yazılım geliştirme

TypeScript Arayüzü ve Tür: Gerçek Farklılıklar, Derleyiciyle Test Edildi

TypeScript arayüzü ve türü, gerçek derleyiciyle kontrol edildi: her ikisinin de yapabileceği, yalnızca birinin yapabileceği, bildirim birleştirme, g…

Makaleyi okuyun →
Yazılım geliştirme

Python *args ve **kwargs'ın Açıklaması: Açık Örneklerle Esnek Fonksiyonlar

Python *args ve **kwargs çalıştırdığımız kodla açıklanmıştır: paketleme ve paketten çıkarma, parametre sırası, yalnızca anahtar kelime ve yalnızca k…

Makaleyi okuyun →
Yazılım geliştirme

Python Lambda İşlevleri: Söz Dizimi, Gerçek Kullanımlar ve Ne Zaman Kullanılmaması Gerektiği

Çalıştırdığımız kodla açıklanan Python lambda işlevleri: sözdizimi, anahtarla sıralama, harita ve filtre, kapatmalar, geç bağlama tuzağı ve normal b…

Makaleyi okuyun →
Yapay zekâ

Yapay Zeka Ajanları Nelerdir? Çalıştırabileceğiniz Basit Bir Aracı Döngüsüyle Nasıl Çalışırlar?

Yapay zeka ajanları nedir? Aracı döngüsüne, araçlara, belleğe ve korkuluklara ilişkin basit bir kılavuz, çalıştırdığımız küçük bir Python döngüsü, g…

Makaleyi okuyun →
DevOps

İzleme ve Gözlemlenebilirlik: Günlükler, Metrikler ve İzlerle Gerçek Fark

İzleme ve gözlemlenebilirliğin açıklanması: bilinen ve bilinmeyen arızalar, günlükler, ölçümler ve izler, ödeme olayının gözden geçirilmesi, altın s…

Makaleyi okuyun →
DevOps

Docker Birimleri ve Bağlama Bağlantıları: Konteyner Verilerini Doğru Şekilde Kalıcılaştırın

Docker birimleri ile bağlama bağlamaları arasındaki karşılaştırma açıklandı: kapsayıcı verilerinin neden kaybolduğu, adlandırılmış birimler, bağlama…

Makaleyi okuyun →
Test otomasyonu

TDD ve BDD: Temel Farklılıklar, Her İki Şekilde Geliştirilmiş Bir Özellik ve Her Birinin Ne Zaman Kullanılacağı

TDD ve BDD, her iki yönde de oluşturulmuş bir indirim özelliğiyle açıklandı: çalıştırdığımız kodla kırmızı-yeşil-refactor, Verilen-Ne Zaman-O Zaman …

Makaleyi okuyun →
Yazılım geliştirme

Git merge vs rebase: farklar, örnekler ve hangisi ne zaman kullanılır

Git merge vs rebase; gerçek log çıktısı, karşılaştırma tablosu, rebase'in altın kuralı ve güvenli bir ekip iş akışıyla anlatılıyor.

Makaleyi okuyun →
Yazılım geliştirme

Python Liste Üreteci (List Comprehension): Sözdizimi, Örnekler ve Kaçınılacak Durumlar

Python list comprehension anlatımı: sözdizimi, filtreleme, if-else, iç içe döngüler, ölçülmüş süreler ve düz for döngüsünün daha iyi olduğu durumlar.

Makaleyi okuyun →
Veritabanları ve SQL

SQL JOIN Örneklerle Açıklama (Inner, Left, Right, Full)

SQL JOIN'leri örnek tablolar ve sorgularla adım adım öğrenin: INNER, LEFT, RIGHT, FULL, CROSS ve SELF; yaygın hatalar ve performans ipuçları.

Makaleyi okuyun →