【问题标题】:I tried seeding my seeder file but I get this error我尝试播种我的播种器文件,但出现此错误
【发布时间】:2019-09-12 14:28:08
【问题描述】:

我尝试发布

$  php artisan db:seed

播种:RoleSeeder

在 Connection.php 第 664 行:

SQLSTATE[42000]:语法错误或访问冲突:1701 不能 截断外键约束中引用的表 (news.users, 恒雨users_role_id_foreign外键 (role_id) 参考news.roles (id)) (SQL: 截断roles)

这是我的 Roleseeder.php 文件

<?php

use Illuminate\Database\Seeder;

use App\Role ;

class RoleSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {

        Role::truncate();

        Role::create([
            'title'   => 'Students',
            'description' => 'Lorem ipsum dolor.'
        ]);

   // ....

我不明白为什么会出现这个错误..

我有这个迁移文件

Schema::table('users', function (Blueprint $table) {
    $table->integer('role_id')->unsigned()->after("id")->nullable();
    $table->foreign('role_id')
            ->references('id')->on('roles')
            ->onDelete('restrict');
});

【问题讨论】:

  • 你为什么要截断表格两次?
  • @sietse85,我编辑了还是一样的错误
  • 你也不能截断它,因为你的新闻表中存在表的键,这个错误是非常自我解释的
  • @sietse85 我不明白他的错误,先生
  • this

标签: php mysql laravel


【解决方案1】:

您的播种失败,因为您试图截断一个表,其中存在其他表通过外键关系依赖的值。您的用户有一个角色,该角色限制您截断角色表。

相反,您可以使用firstOrCreate() 方法,该方法仅在值不存在时创建。

public function run()
{
    Role::firstOrCreate([
            'title'   => 'Students',
            'description' => 'Lorem ipsum dolor.'
        ]);
}

或者,如果您希望能够在每次播种之间更改描述,您可以使用firstOrNew()

public function run()
{
    $role = Role::firstOrNew([
            'title'   => 'Students'
        ]);
    $role->description = 'Lorem ipsum dolor.';
    $role->save();
}

或者,您可以更改外键关系以将值设置为 null 如果它被删除(请注意,当您随后截断您的 Roles 时,所有用户的角色都将设置为 NULL)。

->onDelete('set null');

如果您确实需要截断表格,您首先需要清除 roles 表格中的依赖值。

【讨论】:

  • 限制怎么样?限制喜欢会影响截断吗?
  • 因为你有restrict,并且roles中有users引用的值,所以不能删除。这就是它的意思 - 如果其他表中有依赖于它的值,则限制删除。
  • 原因略有不同:在 MySQL 中,truncate table 语句在后台删除并重新创建表。如果表被外键引用,则不能删除它(无论其中是否有任何引用的值,因此即使表为空也会收到错误消息),因此会出现错误消息。因此,在截断的情况下,将外键更改为级联删除将无济于事。您必须改用删除语句或删除 fk,截断并重新创建 fk。
猜你喜欢
  • 1970-01-01
  • 2021-08-19
  • 2019-11-14
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多