Laravel-Eloquent截断-外键约束


Laravel Eloquent truncate - Foreign key constraint

我在使用Laravel 5删除数据时遇到了一些问题。我似乎被"外键约束"卡住了,但我不明白为什么。

在我当前的数据库模型中,我有一个datapoints表,它有一个传感器表的外键(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)引用alertingsensorsid))(SQL:截断sensors

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

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

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

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

不,这是数据库的工作方式。不能截断其他表引用的表。你可以做一些类似的事情
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
DB::table('datapoints')->truncate();
DB::table('sensors')->truncate();
DB::statement('SET FOREIGN_KEY_CHECKS=1;');

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

如果您更喜欢使用Eloquent对象,Maksym的答案是"Eloquet"方式

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

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

Laravel 7和8中,为了在4个数据库(MySqlPostgresSQLiteSqlServer)之间兼容,并且没有Eloquent,您可以使用:

Schema::disableForeignKeyConstraints();
DB::table('datapoints')->truncate();
DB::table('sensors')->truncate();
Schema::enableForeignKeyConstraints();