Mysql ve TRUNCATE 1071 Hatası

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ı : aracrenkleridatabase_name

 

 

 

2- Renkler(Şekil 1) ve araba(Şekil 2) gösteren  iki adet tablo oluşturalım.

renkler

Şekil 1

araba

 Şekil 2

3- Bu iki tablo arasındaki ilişkiyi (Foreign Keyforeign) sağlayalım.

iliski

4- İlişkiyi kurduğumuza göre birkaç tane veri girelim

renkVeri     arabaVeri

 

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.