У меня возникли некоторые проблемы с удалением данных с помощью Laravel 5. Кажется, я застрял в «ограничении внешнего ключа», хотя не понимаю, почему.
В моей текущей модели базы данных у меня есть таблица точек данных, которая имеет внешний ключ к таблице датчиков (datapoints.sensors_id -> sensor.id).
Код, который я пытаюсь:
Route::get('/truncateData', function() {
DB::table('datapoints')->truncate();
DB::table('sensors')->truncate();
return 'Done...';
});
Результат:
SQLSTATE [42000]: синтаксическая ошибка или нарушение доступа: 1701 не может
усекать таблицу, на которую ссылается ограничение внешнего ключа
(alerting
,datapoints
, ОГРАНИЧЕНИЕdatapoints_sensor_id_foreign
ИНОСТРАННЫЙ КЛЮЧ (sensor_id
) РЕКОМЕНДАЦИИalerting
,sensors
(id
))
(SQL: усечьsensors
)
Я бы понял это ограничение, если бы порядок был обратным (сначала удаление датчиков), но когда точки данных пусты, не должно быть проблем с удалением датчиков? Я также попробовал:
DB::table('datapoints')->delete();
DB::table('sensors')->delete();
return 'Done...';
Наконец, я также попытался явно добавить DB :: commit () между операторами delete, но все они возвращают один и тот же результат.
Это нормальное поведение? Я что-то пропустил?
Заранее спасибо.
Ура,
Wesley
Нет, так работает ваша база данных. Вы не можете усечь таблицу, на которую ссылается какая-либо другая таблица. Вы можете сделать что-то вроде
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
DB::table('datapoints')->truncate();
DB::table('sensors')->truncate();
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
чтобы отключить проверку внешнего ключа, обрезать таблицы и включить его снова.
Если вы предпочитаете использовать Eloquent объекты, ответ Максима «Eloquent»
use Illuminate\Support\Facades\Schema;
use App\Models\Datapoint;
use App\Models\Sensor;Schema::disableForeignKeyConstraints();
Datapoint::truncate();
Sensor::truncate();
Schema::enableForeignKeyConstraints();