Laravel Eloquent truncate — ограничение внешнего ключа

У меня возникли некоторые проблемы с удалением данных с помощью 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

9

Решение

Нет, так работает ваша база данных. Вы не можете усечь таблицу, на которую ссылается какая-либо другая таблица. Вы можете сделать что-то вроде

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

чтобы отключить проверку внешнего ключа, обрезать таблицы и включить его снова.

18

Другие решения

Если вы предпочитаете использовать Eloquent объекты, ответ Максима «Eloquent»

use Illuminate\Support\Facades\Schema;
use App\Models\Datapoint;
use App\Models\Sensor;Schema::disableForeignKeyConstraints();
Datapoint::truncate();
Sensor::truncate();
Schema::enableForeignKeyConstraints();
4