MySQL/PHP ile Tüm Tabloları Truncate Etme (Temizleme)

Bir projede kurulum yaparken tüm tabloları temizlemem gerekiyor. Tek tek elle yapsam olmaz, tablo adlarını bir diziye aktarıp truncate etsem saçma olur. Bunun için information_schema’ı kullanarak tabloları çektim ve döngüye sokarak temizleme işlemi yaptım. Yani sql sorgum şöyle;

SELECT CONCAT("TRUNCATE TABLE ", table_schema, ".", TABLE_NAME, ";") FROM INFORMATION_SCHEMA.TABLES
WHERE table_schema IN("db_adi", "db_adi2")

Burada concat ile değerleri birleştirince tüm tablolarıma ait otomatik truncate kodu çıkmış oldu. Şimdi bunu php ile birleştirdiğimizde;

<?php
// pdo db bağlantı işlemleri ..

$query = $db->query('SELECT CONCAT("TRUNCATE TABLE ", table_schema, ".", TABLE_NAME, ";") FROM INFORMATION_SCHEMA.TABLES WHERE table_schema IN("mvc")')->fetchAll(PDO::FETCH_ASSOC);

foreach ($query as $row){
echo $db->query(current($row))->fetch();
}

Not: Eğer SQLSTATE[42000]: Syntax error or access violation hatası alıyorsanız, foreach’den önce yani sorguları çalıştırmadan önce FOREIGN_KEY_CHECKS değerini 0’a eşitleyip deneyin. Yani;

<?php
// pdo db bağlantı işlemleri ..

$query = $db->query('SELECT CONCAT("TRUNCATE TABLE ", table_schema, ".", TABLE_NAME, ";") FROM INFORMATION_SCHEMA.TABLES WHERE table_schema IN("mvc")')->fetchAll(PDO::FETCH_ASSOC);
$db->query('SET FOREIGN_KEY_CHECKS=0')->fetch();
foreach ($query as $row){
echo $db->query(current($row))->fetch();
}

İşte bu kadar 🙂 Benim hazırladığım BasicDB sınıfında ise son versiyonunu indirdikten sonra şu şekilde kullanmak yeterli;

<?php
// basicdb bağlantı işlemleri ..
$db->truncateAll();

Bu metod içerisinde AUTO_INCREMENT değerleride 1’den başlayacak şekilde ayarlanıyor. Dilerseniz kendi şu sql sorgusu ile tablolarınızın başlangıç değerlerini de ayarlayabilirsiniz.

ALTER TABLE `db_adi`.`tablo_adi` AUTO_INCREMENT = 1; # 1 ya da kaçtan başlayacaksa o

Yazar: Tayfun Erbilen

2009'dan beri web işleriyle uğraşan, aynı zamanda amatör müziklede ilgilenen sıradan birisi..

“MySQL/PHP ile Tüm Tabloları Truncate Etme (Temizleme)” için 5 yorum

  1. BasicDb sınıfında delete ile her tablo için tek tek silme komutu yazarak yine döngü içinde tüm satırları silebiliyoruz. Doğru anladıysam bu truncate işlemini sınıfa dahil ederek, tablo adlarını tek tek yazmadan tüm veritabanı içini boşaltabiliyoruz. Yapı yine aynı kalıyor. Bonus olarak auto increment 1 den başlıyor. Veya istediğimiz rakamdan. Nerede kullanabilirim diye düşünürken lisansı yoksa sürekli tüm tablo içlerini boşaltmak gibi bir fikir geldi kullanım olarak. Teşekkürler Tayfun.

  2. Bunu yapmak için PHP’ye gerek yok. Tek SQL query ile işini halledebilirsin.

    SELECT
    Concat(‘TRUNCATE TABLE ‘, TABLE_NAME)
    FROM
    INFORMATION_SCHEMA.TABLES
    WHERE
    table_schema = ‘db_name’;

    Eğer foreign key constraints hatası alırsan geçici olarak SET FOREIGN_KEY_CHECKS=0; sorgusunu yukarıdaki sorgudan önce çalıştırabilirsin.

    İşin bitince tekrar SET FOREIGN_KEY_CHECKS=1; komutunu çalıştırabilirsin.

    🙂

    1. verdiğin kodlar zaten benim paylaştığım kodların aynısı, bu kodlar sana truncate kodlarını üretir ama execute etmez, dilersen çalıştırıp test edebilirsin dump edip etmediğini 🙂 kaçırdığım bir nokta varsa paylaş ki bilelim

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.