SQLSTATE[HY000]:一般错误:在 Laravel 中迁移期间出现 1005

Posted

技术标签:

【中文标题】SQLSTATE[HY000]:一般错误:在 Laravel 中迁移期间出现 1005【英文标题】:SQLSTATE[HY000]: General error: 1005 during a migration in Laravel 【发布时间】:2020-03-19 15:05:10 【问题描述】:

我正在使用 Laravel 6。我想运行我的迁移文件,但在迁移我的“create_users_table”文件期间出现以下错误:

SQLSTATE[HY000]: General error: 1005 Can't create tab
le `thenewmeetingapp`.`#sql-f3c_b8` (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter table 
`users` add constraint `users_permission_id_foreign` foreign key (`permission_id`) references `permissions` (`id`))

我认为错误出现在“users”表和“permissions”表之间(每个用户都必须有一个权限,每个权限都可以有很多用户)。 然而,表“users”甚至与表“meeting_user”相关,该表是与表“meetings”连接的表。

用户:

Schema::create('users', function (Blueprint $table) 
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('surname');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('username')->unique();
            $table->string('password');
            $table->bigInteger('permission_id')->unsigned();
            $table->enum('is_active', array(0, 1))->default(1);
            $table->rememberToken();
            $table->timestamps();
            $table->foreign('permission_id')->references('id')->on('permissions');

        );

权限:

Schema::create('permissions', function (Blueprint $table) 
            $table->bigIncrements('id');
            $table->string('name');
            $table->timestamps();
        );

meeting_user:

Schema::create('meeting_user', function (Blueprint $table) 
            $table->unsignedBigInteger('user_id');
            $table->unsignedBigInteger('meeting_id')->unsigned();
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            $table->foreign('meeting_id')->references('id')->on('meetings')->onDelete('cascade');
        );

用户表的迁移是要运行的第一个迁移。但是,我也尝试在迁移权限表之前和用户表之后运行,但没有任何改变。错误是一样的。 有人可以帮助我吗?

【问题讨论】:

您的第二个表permissions 是否有其id 字段,它是一个身份字段吗? 好的,您必须首先运行permissions 迁移,其次是users 迁移,然后是meetings,最后是meeting_user。请注意,您可以更改顺序,更改文件名上的时间戳,并在运行迁移之前运行 composer dump-autoload 我尝试先使用命令php artisan migrate --path=/database/migrations/test/ 运行权限迁移,但没有成功...我只创建了迁移表。随着您的技术更改时间戳,因此它可以正常工作。非常感谢。 【参考方案1】:

您需要先创建您在users 上的外键指向的另一个表permissions,然后才能将键添加到users。所以这个创建users 表的特定迁移不能是第一个。另一个表 permissions 必须存在才能引用它。

如果您无法重新排序这些迁移,您可以从 users 迁移中删除外键部分。然后创建一个新的迁移,改变users 表并添加外键;现在(通过时间戳)将在 permissions 表迁移之后运行。

【讨论】:

【参考方案2】:

正如@lagbox 的回答所解释的,您不能为尚不存在的表中的列创建外键。 所以,我建议的方法是你改变迁移的顺序,改变每个迁移的文件名的时间戳,以便它们按以下顺序执行:

    permissions users meetings, meeting_user

请注意,更改文件名后,您必须先运行composer dump-autoload,然后才能再次运行迁移。

【讨论】:

以上是关于SQLSTATE[HY000]:一般错误:在 Laravel 中迁移期间出现 1005的主要内容,如果未能解决你的问题,请参考以下文章

SQLSTATE[HY000]:一般错误:1364 字段

SQLSTATE [HY000]:一般错误:1364 字段 'uID' 没有默认值

SQLSTATE [HY000]:一般错误:1364 字段“名称”没有默认值

SQLSTATE[HY000]:在 symfony 中创建表的一般错误

SQLSTATE [HY000]:一般错误:1364 字段“标题”没有默认值

SQLSTATE[HY000]:一般错误:无法创建表