Laravel Eloquent 截断 - 外键约束

问题描述 投票:0回答:3

我在使用 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()”,但都返回相同的结果。

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

php laravel postgresql laravel-5 constraints
3个回答
81
投票

不,这就是数据库的工作方式。您无法截断由其他表引用的表。你可以做类似的事情

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

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


46
投票

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

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


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

13
投票

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

Schema::disableForeignKeyConstraints();
DB::table('datapoints')->truncate();
DB::table('sensors')->truncate();
Schema::enableForeignKeyConstraints();
© www.soinside.com 2019 - 2024. All rights reserved.