2015-03-18 14 views
7

Ho alcuni problemi con l'eliminazione dei dati utilizzando Laravel 5. Mi sembra di essere bloccato su un "vincolo di chiave esterna", mentre non vedo perché.Laravel Eloquent troncato - Vincolo chiave esterna

Nel mio modello di database corrente ho una tabella dei datapoints, che ha una chiave esterna nella tabella dei sensori (datapoints.sensors_id -> sensor.id).

Il codice che sto cercando:

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

});

Il risultato:

SQLSTATE [42000]: Errore di sintassi o violazione di accesso:. 1701 non possibile troncare una tabella di riferimento in un vincolo di chiave esterna (alertingdatapoints, VINCOLO datapoints_sensor_id_foreign FOREIGN KEY (sensor_id) . RIFERIMENTI alertingsensors (id)) (SQL: troncare sensors)

Comprenderei questo vincolo se l'ordine fosse inverso (eliminando prima i sensori), ma quando i punti dati sono vuoti, non dovrebbero esserci problemi nell'eliminazione dei sensori? Ho anche provato:

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

Infine ho anche provato ad aggiungere in modo esplicito 'DB :: commit()' tra le dichiarazioni di eliminazione, ma tutti lo stesso risultato.

È normale? Mi sto perdendo qualcosa?

Grazie in anticipo.

Cheers,

Wesley

risposta

11

No, questo è il modo in cui funziona il database. Non è possibile troncare la tabella a cui fa riferimento un'altra tabella. Si può fare qualcosa come

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

per disabilitare i controlli delle chiavi esterne, troncare le tabelle e abilitarlo nuovamente.

+0

Infatti. Alla fine ho cancellato le righe invece di troncare, ma anche questo funzionerebbe. Stavo sbagliando quando ho detto che il problema si presentava anche con le eliminazioni. – Wesley

Problemi correlati