Laravel Eloquent truncate - 外键约束

Posted

技术标签:

【中文标题】Laravel Eloquent truncate - 外键约束【英文标题】:Laravel Eloquent truncate - Foreign key constraint 【发布时间】:2015-05-21 01:44:55 【问题描述】:

我在使用 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) 引用 alerting.sensors (id)) (SQL:截断sensors

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

确实如此。我最终删除了行而不是截断,但这也可以。当我说问题也与删除有关时,我误会了。 这只适用于 mysql 和衍生产品。使用@JoeGalind 的答案进行交叉兼容性 最好使用 Eloquent,就像 JoeGalind 说的那样,所以你可以使用任何只适用于 mysql 的数据库管理器。 这就是我在不禁用和启用外键检查的情况下解决我的问题https://***.com/questions/31192207/laravel-5-1-migration-and-seeding-cannot-truncate-a-table-referenced-in-a-foreig/64202344#64202344 ...我希望它可以帮助某人【参考方案2】:

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

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


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

【讨论】:

【参考方案3】:

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

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

【讨论】:

我也有同样的问题,我正在使用 Laravel 7。但这对我不起作用。它抛出一个错误:错误调用未定义的方法 Illuminate\Database\MySqlConnection::schema()。我该如何解决这个问题? @Zeenath 我已经编辑了我的答案。这应该有效。 可能需要做 \Schema::

以上是关于Laravel Eloquent truncate - 外键约束的主要内容,如果未能解决你的问题,请参考以下文章

php Laravel 5 Eloquent CheatSheet #laravel #eloquent

php Laravel 5 Eloquent CheatSheet #laravel #eloquent

php [Eloquent CheatSheet] Eloquent #laravel #eloquent的常见查询方法

Laravel - Eloquent 连接

Laravel 从 Raw DB 到 Eloquent

Laravel/Eloquent 建议覆盖 trait 属性?