Truncate , istenilen tablonun içini her hangi bir koşul belirtmeden tüm veriyi temizlemeye yarar.
TRUNCATE [TABLE] tbl_name şeklinde yazılır .
DELETE,Truncate komutu ile karıştırılır. Aralarındaki fark ise ;
Delete komutu, belirtilen hücre, satır, sütün veya tablonun içindeki verileri silmeye yarar (Delete komutu bir koşula da bağlanabilir) ve silinen tablodaki Primary key ve auto increment (Otomatik Artan Numara) alanı en son kaldığı değerden devam eder.
Truncate komutu , tabloya ait veriyi serbest bırakır, böylece tüm
satırları tek seferde siler ve transaction log serbest bırakma işlemini tutar. Bu yüzden veri ne kadar büyük olursa olsun çok hızlı çalışır.(Truncate komutu koşula bağlanmaz) ve silinen tablodaki Primary key ve Auto increment değerleri sıfırlanır.
Örnek olarak
Araçlarımızın renklerini tutan bir veri tabanı kurgulayalım.
1- Veri tabanımızın adı : aracrenkleri
2- Renkler(Şekil 1) ve araba(Şekil 2) gösteren iki adet tablo oluşturalım.
Şekil 1
Şekil 2
3- Bu iki tablo arasındaki ilişkiyi (Foreign Key) sağlayalım.
4- İlişkiyi kurduğumuza göre birkaç tane veri girelim
5- Silmek istediğimiz tabloyu belirledikten sonra komutumuzu sorgu satırına yazalım.
Truncate aracmodel.araba;
Yaptığınızda sorunsuz silecektir . İlişkinin olduğu tabloda ise kısıtlamalardan dolayı hata verecektir.
Truncate aracmodel.renk;
Error Code: 1701. Cannot truncate a table referenced in a foreign key constraint (`aracmodel`.`araba`, CONSTRAINT `araba_ibfk_1` FOREIGN KEY (`renk_id`) REFERENCES `aracmodel`.`renk` (`id`))
Çözüm 1 ;
1 – İlişkileri keselim.
2- Truncate çalıştıralım.
3- İlişkisi olan diğer tablodaki verileri Delete ile silelim.
4- İlişkileri tekrar kuralım.
Çözüm 2;
SET FOREIGN_KEY_CHECKS = 0;
Truncate aracmodel.renk;
TRUNCATE [TABLE] tbl_name;
TRUNCATE [TABLE] tbl_name2;
TRUNCATE [TABLE] tbl_name3;
...
..
..
SET FOREIGN_KEY_CHECKS = 1;
Şimdi ikisi arasındaki farka gelince çözüm 2 ,çözüm 1 ‘e göre daha risklidir ;veriye zarar verme riski taşır.Silme işlemi sırasında veri tabanı işlem yapmıyorsa çözüm 2 ‘yi daha hızlı ve komutun Global olmaması daha kullanışlı hale getirir.