Wes*_*ley 14 php postgresql constraints laravel
我在使用Laravel 5删除数据时遇到了一些问题.我似乎陷入了"外键约束",但我不明白为什么.
在我当前的数据库模型中,我有一个datapoints表,它有一个传感器表的外键(datapoints.sensors_id - > sensor.id).
我正在尝试的代码:
Route::get('/truncateData', function() {
DB::table('datapoints')->truncate();
DB::table('sensors')->truncate();
return 'Done...';
Run Code Online (Sandbox Code Playgroud)
});
结果:
SQLSTATE [42000]:语法错误或访问冲突:1701无法截断外键约束中引用的表(
alerting.datapoints,CONSTRAINTdatapoints_sensor_id_foreignFOREIGN KEY(sensor_id)REFERENCESalerting.sensors(id))(SQL:truncatesensors)
如果订单是反向的(首先删除传感器),我会理解这个约束,但是当数据点为空时,删除传感器应该没有问题吗?我也尝试过:
DB::table('datapoints')->delete();
DB::table('sensors')->delete();
return 'Done...';
Run Code Online (Sandbox Code Playgroud)
最后我还尝试在delete语句之间显式添加'DB :: commit()',但都返回相同的结果.
这是正常的行为吗?我错过了什么吗?
提前致谢.
干杯,
韦斯利
Mak*_*iak 26
不,这是数据库的工作方式.您不能截断由其他表引用的表.你可以做点什么
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
DB::table('datapoints')->truncate();
DB::table('sensors')->truncate();
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
Run Code Online (Sandbox Code Playgroud)
禁用外键检查,截断表并再次启用它.
Bin*_*Web 13
在Laravel 7 和 8中,为了兼容 4 个数据库(MySql、Postgres、SQLite和SqlServer)且没有 Eloquent,您可以使用:
Schema::disableForeignKeyConstraints();
DB::table('datapoints')->truncate();
DB::table('sensors')->truncate();
Schema::enableForeignKeyConstraints();
Run Code Online (Sandbox Code Playgroud)
如果您更喜欢使用雄辩的对象,Maksym的回答是“雄辩的”方式
use Illuminate\Support\Facades\Schema;
use App\Models\Datapoint;
use App\Models\Sensor;
Schema::disableForeignKeyConstraints();
Datapoint::truncate();
Sensor::truncate();
Schema::enableForeignKeyConstraints();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8811 次 |
| 最近记录: |