Php Laravel雄辩截断-外键约束

Php Laravel雄辩截断-外键约束,php,laravel,postgresql,laravel-5,constraints,Php,Laravel,Postgresql,Laravel 5,Constraints,我在使用Laravel 5删除数据时遇到一些问题。我似乎被“外键约束”卡住了,但我不明白为什么 在我当前的数据库模型中,我有一个datapoints表,它有一个sensors表的外键(datapoints.sensors\u id->sensor.id) 我正在尝试的代码: Route::get('/truncateData', function() { DB::table('datapoints')->truncate(); DB::table('sensors')-&g

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

在我当前的数据库模型中,我有一个datapoints表,它有一个sensors表的外键(datapoints.sensors\u id->sensor.id)

我正在尝试的代码:

Route::get('/truncateData', function() {
    DB::table('datapoints')->truncate();
    DB::table('sensors')->truncate();
    return 'Done...';
});
结果是:

SQLSTATE[42000]:语法错误或访问冲突:1701无法 截断外键约束中引用的表 (
警报
数据点
,约束数据点_传感器_id_外部 外键(
sensor\u id
)引用
警报
传感器
id
) (SQL:truncate
传感器

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

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;');

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

如果您喜欢使用雄辩对象,Maksym的回答是“雄辩”


Laravel 7和8中,为了跨4个数据库(MySqlPostgresSQLiteSqlServer)和无雄辩的兼容性,您可以使用:

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

的确我最终删除了行而不是截断,但这也会起作用。当我说删除也会出现问题时,我错了。这只适用于MySQL和衍生品。使用@JoeGalind的答案进行交叉兼容性更好地使用JoeGalind所说的雄辩,因此您可以使用任何只适用于mysql的数据库管理器。这就是我在不禁用和启用外键检查的情况下解决我的问题的方法。。。我希望它能帮助一些人我也有同样的问题,我使用的是Laravel7。但这对我不起作用。它抛出一个错误:错误调用未定义的方法illumb\Database\MySqlConnection::schema()。我如何解决这个问题?@Zeenath我已经编辑了我的答案。这应该可以。可能必须执行\Schema::
Schema::disableForeignKeyConstraints();
DB::table('datapoints')->truncate();
DB::table('sensors')->truncate();
Schema::enableForeignKeyConstraints();