2015-03-18 33 views
7

Laravel 5'i kullanarak veri silme ile ilgili bazı sorunlar yaşıyorum. Nedenini görmezken bir 'yabancı anahtar kısıtlaması' üzerinde sıkışmış gibi görünüyorum.Laravel Eloquent truncate - Yabancı anahtar kısıtlaması

Güncel veritabanı modelimde sensörler tablosuna (datapoints.sensors_id -> sensor.id) yabancı bir anahtar içeren bir veri noktaları tablosu var.

kod deniyorum:

Route::get('/truncateData', function() { 
DB::table('datapoints')->truncate(); 
DB::table('sensors')->truncate(); 
return 'Done...'; 

});

sonucu:

sqlstate [42000]: sözdizimi hatası veya erişim ihlali:. 1701 yabancı anahtar kısıtlaması (alertingdatapoints başvurulan bir tabloyu kesmek değil Can, KISITLAMA YABANCI KEY (sensor_iddatapoints_sensor_id_foreign) . REFERANSLAR alertingsensors (id)) (SQL: sensors kesecek)

Siparişin tersi (sensörlerin ilk kez silinmesi) durumunda, ancak veri noktaları boş olduğunda, sensörlerin silinmesiyle ilgili sorun olmazsa, bu kısıtlamayı anlayacağım.

DB::table('datapoints')->delete(); 
DB::table('sensors')->delete(); 
return 'Done...'; 

Son olarak ben de silme tabloları arasındaki '() DB :: işlemek' açıkça ekleyerek çalıştı, ama hepsi aynı sonucu döndüren: Ben de çalıştık.

Bu normal davranış mı? Bir şey mi eksik?

Şimdiden teşekkürler.

Alkış,

Wesley

cevap

11

Hayır, bu veritabanı çalışır yoludur. Başka bir tablo tarafından başvurulan tabloyu kesemezsiniz. Sen, yabancı anahtar denetimlerini devre dışı bırakmak tabloları kesecek ve tekrar etkinleştirmek için

DB::statement('SET FOREIGN_KEY_CHECKS=0;'); 
DB::table('datapoints')->truncate(); 
DB::table('sensors')->truncate(); 
DB::statement('SET FOREIGN_KEY_CHECKS=1;'); 

gibi bir şey yapabilir.

+0

Gerçekten de. Sonunda satırları kesmek yerine sildim ancak bu da işe yarayacaktı. Sorunun silerle de ortaya çıktığını söylediğimde hata yapıyordum. – Wesley

İlgili konular