Laravel Eloquent truncate - 外键约束

时间:2015-03-18 10:14:26

标签: php postgresql laravel constraints

我在使用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不能   截断外键约束中引用的表   (alertingdatapoints,CONSTRAINT datapoints_sensor_id_foreign   FOREIGN KEY(sensor_id)参考alertingsensorsid))   (SQL:truncate sensors

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

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

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

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

提前致谢。

干杯,

韦斯利

3 个答案:

答案 0 :(得分:18)

不,这是数据库的工作方式。您不能截断某些其他表引用的表。您可以执行类似

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

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

答案 1 :(得分:4)

如果您更喜欢使用雄辩的对象,那么马克西姆的回答就是“雄辩”的方式

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


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

答案 2 :(得分:2)

Laravel 7 中,为实现4个数据库( MySql Postgres SQLite SqlServer )并且没有口才,可以使用:

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