Tüm barındırma hizmetlerinde 15% tasarruf edin

Becerilerini test et ve herhangi bir hosting planında İndirim kazan

Kodu kullanın: Skills Başlayın
Bölüm
Yönetim

MySQL’de Tablo Temizleme: DELETE, TRUNCATE ve DROP’a Tam Rehber

Bir MySQL tablosundan veri silmek veya temizlemek, veritabanı yönetiminin en rutin ancak önemli görevlerinden biridir. İster eski kayıtları kaldırıyor, ister bir hazırlık ortamını sıfırlıyor, ister eski bir tabloyu tamamen devre dışı bırakıyor olun, yanlış komut seçmek geri döndürülemez veri kaybına veya beklenmedik performans sorunlarına yol açabilir.

Bu kılavuz, MySQL tablosunu temizlemek için mevcut olan her yöntemi size gösterir — gerçek sözdizimi örnekleri, her yaklaşımın net bir karşılaştırması ve verilerinizi güvende tutmak için en iyi uygulamalar ile birlikte.

1. Seçeneklerinizi Anlamak: “Tabloyu Temizlemek” Aslında Ne Demek?

MySQL’de “tabloyu temizlemek” tek bir işlem değildir — amacınıza bağlı olarak birkaç farklı işlemi ifade eder:

KomutVerileri KaldırırYapıyı KaldırırOtomatik Artışı SıfırlarHız
DELETEEvet (seçici veya tümü)HayırHayırDaha Yavaş
TRUNCATEEvet (tüm satırlar)HayırEvetDaha Hızlı
DROPEvetEvetYokAnlık

Herhangi bir komutu çalıştırmadan önce bu farklılıkları anlamak kritiktir, özellikle üretim veritabanlarında. Kendi sunucu ortamınızı yönetiyorsanız — örneğin, bir VPS Hosting planında — MySQL’e tam kök erişiminiz vardır, bu da yanlışlıkla veri kaybını önleyen hiçbir koruma mekanizmasının olmadığı anlamına gelir.

2. Yöntem 1 — DELETE Komutunu Kullanma

DELETE ifadesi en esnek seçenektir. Bir koşula dayalı olarak bir tablodan satırları kaldırır veya hiçbir koşul sağlanmazsa tüm satırları kaldırır. TRUNCATE aksine, her bir satır silmeyi kaydeder, bu da büyük tablolarda daha yavaş olmasını sağlar ancak size ayrıntılı kontrol verir.

Bir Tablodan Tüm Satırları Silme

DELETE FROM table_name;

Bu, table_name içindeki her satırı kaldırır ancak tablo yapısını, dizinleri ve otomatik artış sayaçlarını korur. Depolama alanı diskte hemen geri alınmaz.

Bir Koşulla Eşleşen Satırları Silme

DELETE FROM table_name WHERE condition;

Örnek — 90 günden eski kayıtları silme:

DELETE FROM user_logs WHERE created_at < NOW() - INTERVAL 90 DAY;

DELETE’nin Temel Özellikleri

  • İşlemsel: DELETE tam olarak ROLLBACK ile uyumludur. Bunu bir işlem içine alırsanız, bir şey yanlış giderse geri alabilirsiniz.
  • Tetikleyici uyumlu: Satır düzeyinde tetikleyiciler (BEFORE DELETE, AFTER DELETE) silinen her satır için çalışır.
  • Büyük tablolarda daha yavaş: Çünkü her silme işlemi ikili günlükte ve InnoDB yeniden yapma günlüğünde ayrı ayrı kaydedilir.
  • Otomatik artışı sıfırlamaz: Sonraki eklenen satır, son en yüksek kimlikten devam eder.

Güvenlik İpucu

SELECT komutunu DELETE yürütmeden önce aynı WHERE cümlesiyle çalıştırın:

-- Preview what will be deleted
SELECT * FROM table_name WHERE condition;

-- Then delete
DELETE FROM table_name WHERE condition;

3. Yöntem 2 — TRUNCATE Komutunu Kullanma

TRUNCATE TABLE bir tablodan tüm satırları mümkün olan en hızlı şekilde silmeniz gerektiğinde tercih edilen komuttur. Bireysel satır silmelerini günlüğe kaydetmek yerine, MySQL tabloyu dahili olarak bırakır ve veri sayfalarını yeniden oluşturur, bu da onu büyük veri setlerinde DELETE öğesinden önemli ölçüde daha hızlı hale getirir.

Sözdizimi

TRUNCATE TABLE table_name;

Örnek — Bir Oturum Önbellek Tablosunu Sıfırlama

TRUNCATE TABLE session_cache;

Bu komuttan sonra tablo boş olur ve otomatik artış sayacı 1 olarak sıfırlanır.

TRUNCATE’in Temel Özellikleri

  • İşlemsel değil (çoğu durumda): InnoDB tablolarında, TRUNCATE örtülü bir commit gerçekleştirir. Yürütüldükten sonra bunu geri alamazsınız.
  • Otomatik artışı sıfırlar: ID sayacı yeniden 1 öğesinden başlar.
  • WHERE yan tümcesi desteği yok: Satırları seçici olarak kaldıramazsınız — hepsi veya hiçbiri.
  • Satır düzeyinde tetikleyicileri çalıştırmaz: Satırlar ayrı ayrı silinmediğinden, DELETE tetikleyicileri yürütülmez.
  • Daha hızlı ve daha verimli: Geliştirme sıfırlamalarında, test ortamlarında veya zamanlanmış bakım işlerinde büyük tabloları temizlemek için idealdir.

TRUNCATE Ne Zaman Kullanılır

TRUNCATE şu durumlarda kullanın:

  • Tüm tabloyu hızlı bir şekilde temizlemeniz gerektiğinde (örneğin, bir günlük tablosu, geçici veri tablosu veya önbellek tablosu).
  • Otomatik artış sayacını sıfırlamak istediğinizde.
  • Geri alma işleminin gerekli olmayacağından emin olduğunuzda.

4. Yöntem 3 — DROP Komutunu Kullanma

DROP TABLE komutu üçünün en yıkıcısıdır. Tabloyu kalıcı olarak kaldırır — tüm veriler, dizinler, kısıtlamalar, tetikleyiciler ve tablo tanımı dahil. Bir kez silindikten sonra, tablo sıfırdan yeniden oluşturmadığınız veya bir yedekten geri yüklemediğiniz sürece kaybolur.

Sözdizimi

DROP TABLE table_name;

Aynı Anda Birden Fazla Tabloyu Silme

DROP TABLE table_one, table_two, table_three;

Bir Tabloyu Yalnızca Varsa Silme (Hataları Önler)

DROP TABLE IF EXISTS table_name;

Bu, tablonun var olup olmadığından emin olamayacağınız geçiş betikleri veya dağıtım otomasyonunda özellikle yararlıdır.

DROP’ın Temel Özellikleri

  • Yedek olmadan kalıcı ve geri döndürülemez.
  • Her şeyi kaldırır: Veriler, yapı, dizinler, yabancı anahtar kısıtlamaları ve tetikleyiciler.
  • Hızlı: Temel veri dosyalarını serbest bıraktığı için TRUNCATE ile yürütme hızı benzerdir.
  • Yeniden oluşturma gerektirir: Tabloyu tekrar kullanmak için tam bir CREATE TABLE ifadesi vermelisiniz.

DROP Ne Zaman Kullanılır

DROP yalnızca şu durumlarda kullanın:

  • Tablo eski ve şemada artık gerekli değildir.
  • Tam bir veritabanı temizliği veya geçişi gerçekleştiriyorsunuz.
  • Verilerin onaylanmış, test edilmiş bir yedeklemesine sahipsiniz.

5. Doğru Yöntemi Seçme: Karar Rehberi

Hangi komutu kullanacağınızdan emin değil misiniz? Bu mantığı izleyin:

  • Belirli satırları silmeniz gerekiyor mu?DELETE ile bir WHERE cümlesi kullanın.
  • Tüm satırları kaldırmanız ancak tablo yapısını korumanız gerekiyor mu?TRUNCATE kullanın.
  • Verileri temizlerken otomatik artışı sıfırlamanız gerekiyor mu?TRUNCATE kullanın.
  • Tabloyu tamamen veritabanından kaldırmanız gerekiyor mu?DROP kullanın.
  • İşlemi geri alma yeteneğine ihtiyacınız var mı? → Bir işlem içinde DELETE kullanın.
  • Yabancı anahtar kısıtlamaları olan bir tablo ile çalışıyor musunuz?DELETE kullanın (yabancı anahtar denetimleri etkinleştirilmişse TRUNCATE başarısız olabilir).

6. MySQL Tablosunu Temizlemeden Önce Gerekli Önlemler

Hangi yöntemi seçerseniz seçin, bu önlemler sizi kritik bir veri kaybı olayından kurtarabilir.

Her Zaman Önce Verilerinizi Yedekleyin

Herhangi bir yıkıcı komutu çalıştırmadan önce tabloyu dışa aktarın:

-- Export to a SQL dump using mysqldump (run from terminal)
mysqldump -u username -p database_name table_name > table_backup.sql

Veya hosting kontrol panelinize entegre edilmiş tam bir veritabanı yedekleme aracı kullanın. cPanel’li bir VPS‘de iseniz, komut satırına dokunmadan doğrudan cPanel arayüzünden otomatik MySQL yedeklemelerini planlayabilirsiniz.

DELETE İşlemleri İçin İşlemleri Kullanın

DELETE ifadelerinizi bir işlemle sarın, böylece etkileri gözden geçirebilir ve işlemeyi onaylayabilirsiniz:

START TRANSACTION;

DELETE FROM orders WHERE status = 'cancelled' AND created_at < '2023-01-01';

-- Review the affected row count, then decide:
ROLLBACK;  -- Undo if something looks wrong
-- or
COMMIT;    -- Confirm the deletion

Çalıştırmadan Önce İzinleri Doğrulayın

Her veritabanı kullanıcısının DELETE, TRUNCATE veya DROP ayrıcalıklarına sahip olması gerekmez. Komutu çalıştıran kullanıcının yalnızca ihtiyaç duyduğu izinlere sahip olduğunu doğrulayın:

SHOW GRANTS FOR 'db_user'@'localhost';

En az ayrıcalık ilkesini takip etmek, yanlışlıkla veya kötü niyetli veri silme riskini azaltır.

Üretim Ortamında Uygulamadan Önce Geliştirme veya Hazırlama Ortamında Test Edin

Yıkıcı SQL komutlarını asla doğrudan bir üretim veritabanında test etmeyin. Üretim şemanızı yansıtan bir hazırlama ortamı kurun, komutları orada çalıştırın ve canlıya almadan önce sonuçları doğrulayın.

Bu, birçok geliştiricinin paylaşılan ortamlar yerine VPS Barındırma‘yı tercih etmesinin nedenlerinden biridir — izole hazırlama örnekleri oluşturabilir, ayrı MySQL kullanıcıları yapılandırabilir ve üretim verilerini riske atmadan özgürce test edebilirsiniz.

Yabancı Anahtar Bağımlılıklarını Kontrol Edin

Bir tabloyu kesintiye uğratmadan veya bırakmadan önce, diğer tabloların yabancı anahtarlar aracılığıyla buna başvurup başvurmadığını kontrol edin:

SELECT 
    TABLE_NAME, 
    COLUMN_NAME, 
    CONSTRAINT_NAME, 
    REFERENCED_TABLE_NAME 
FROM 
    INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE 
    REFERENCED_TABLE_NAME = 'your_table_name';

Yabancı anahtar kısıtlamaları varsa, TRUNCATE başarısız olacaktır. Yabancı anahtar kontrollerini geçici olarak devre dışı bırakmanız gerekebilir:

SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE TABLE table_name;
SET FOREIGN_KEY_CHECKS = 1;

Bunu son derece dikkatli kullanın — yabancı anahtar kontrollerini devre dışı bırakmak, dikkatli bir şekilde ele alınmazsa veritabanınızı tutarsız bir durumda bırakabilir.

7. Hızlı Referans: Komut Karşılaştırma Özeti

-- Remove specific rows (reversible with ROLLBACK)
DELETE FROM table_name WHERE condition;

-- Remove all rows, reset auto-increment (fast, not reversible)
TRUNCATE TABLE table_name;

-- Remove the entire table including structure (permanent)
DROP TABLE table_name;

-- Safe version of DROP (no error if table doesn't exist)
DROP TABLE IF EXISTS table_name;

8. Barındırılan Bir Ortamda MySQL Tablo Yönetimi

Barındırılan bir sunucuda MySQL veritabanlarını yönetiyorsanız, size sunulan araçlar barındırma planınıza bağlıdır:

  • Paylaşılan Barındırma: Tipik olarak cPanel üzerinden phpMyAdmin aracılığıyla yönetilir. SQL sorgu arayüzü aracılığıyla DELETE, TRUNCATE ve DROP çalıştırabilirsiniz. AlexHost’tan Paylaşılan Web Barındırma planları kutudan çıktığı gibi phpMyAdmin erişimi içerir.
  • VPS Barındırma: Tam SSH erişimi ve root MySQL ayrıcalıkları. Cron işleri ve shell betikleri ile veritabanı bakımını otomatikleştirebilirsiniz. İş akışınız için doğru yönetim arayüzünü bulmak için VPS Kontrol Panelleri‘ni keşfedin.
  • Özel Sunucular: Büyük tablolara sahip yüksek trafikli veritabanları için maksimum kontrol ve performans. Özel Sunucular, çok gigabaytlık tablolarda TRUNCATE veya DROP işlemleri optimize edilmiş I/O performansı gerektirdiğinde idealdir.

Son Düşünceler

MySQL tablosunu temizlemek basit bir görevdir — ancak yalnızca doğru durumda doğru komutu kullandığınızda. Özetlemek gerekirse:

  • Hassasiyet için DELETE kullanın: belirli satırları kaldırın, işlemsel kalın ve otomatik artış değerlerini koruyun.
  • Hız için TRUNCATE kullanın: tüm tabloyu anında silin ve otomatik artış sayacını sıfırlayın.
  • Kesinlik için DROP kullanın: artık ihtiyaç duymadığınız tabloyu kalıcı olarak kaldırın.

Her durumda, yürütmeden önce verilerinizi yedekleyin, hazırlama ortamında test edin ve izinleri doğrulayın. Birkaç saniye ihtiyatlılık, saatlerce kurtarma çalışmasını önleyebilir.