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 字段 'uID' 没有默认值
SQLSTATE [HY000]:一般错误:1364 字段“名称”没有默认值
SQLSTATE[HY000]:在 symfony 中创建表的一般错误