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 无法截断外键约束(.,约束外键 () 引用 )中引用的表。()) (SQL: truncatealertingdatapointsdatapoints_sensor_id_foreignsensor_idalertingsensorsidsensors)

如果顺序是相反的(首先删除传感器),我会理解这个约束,但是当数据点为空时,删除传感器应该没有问题吗?我也试过:

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

最后,我还尝试在 delete 语句之间显式添加 'DB::commit()',但都返回相同的结果。

这是正常行为吗?我错过了什么吗?


答案 1

不,这是数据库的工作方式。不能截断由其他表引用的表。你可以做这样的事情

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

要禁用外键检查,请截断表并再次启用它。


答案 2

如果你更喜欢使用雄辩的对象,Maksym的回答是“雄辩”的方式

use Illuminate\Support\Facades\Schema;
use App\Models\Datapoint;
use App\Models\Sensor;


Schema::disableForeignKeyConstraints();
Datapoint::truncate();
Sensor::truncate();
Schema::enableForeignKeyConstraints();

推荐