【问题标题】:SQLSTATE[HY000]: General error: 1005 during a migration in LaravelSQLSTATE[HY000]:一般错误:在 Laravel 中迁移期间出现 1005
【发布时间】: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/ 运行权限迁移,但没有成功...我只创建了迁移表。随着您的技术更改时间戳,因此它可以正常工作。非常感谢。

标签: laravel database-migration


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    1. permissions
    2. users
    3. meetings,
    4. meeting_user

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

    【讨论】:

      猜你喜欢
      • 2017-01-31
      • 2020-05-26
      • 2020-05-13
      • 1970-01-01
      • 1970-01-01
      • 2021-03-20
      • 2014-01-26
      • 1970-01-01
      • 2020-01-15
      相关资源
      最近更新 更多