使用Laravel迁移创建外键时出现MySQL错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Laravel迁移创建外键时出现MySQL错误相关的知识,希望对你有一定的参考价值。

我有一个Laravel应用程序设置,我正在使用Sentry 2进行用户身份验证。我有一个名为Post的模型以及默认的哨兵User表。我想让一个用户有很多帖子,一个帖子属于一个用户。为了在我的数据库模式中反映这一点,我需要在postsusers之间创建一个外键约束。

我写的迁移如下:

public function up()
{
    Schema::table('posts', function(Blueprint $table)
    {
        $table->integer('user_id')->after('id')->nullable();
        $table->foreign('user_id')->references('id')->on('users');
    });
}

使用php artisan migrate运行它后,我在命令提示符中收到mysql错误:

[照亮数据库 QueryException] SQLSTATE [HY000]:常规错误:1005无法创建表'blog.dev。#sql-3bb_2d'(错误号:150)(SQL:alter table posts添加约束posts_user_id_foreign外键(user_id)引用usersid))

起初我认为发生这个错误是因为users中的主键列的定义与我的外键列user_id不同,但是它们都被定义为int(10)

从Google我了解到这个错误可能是由于两个列定义不同造成的,但是这里似乎并不是这样。

答案

外键应该已经在数据库中,因此我建议采取两个步骤。另外我建议将列user_id无符号:

public function up()
{
    Schema::table('posts', function(Blueprint $table)
    {
        $table->integer('user_id')->after('id')->nullable()->unsigned();
    });

    Schema::table('posts', function(Blueprint $table)
    {
        $table->foreign('user_id')->references('id')->on('users');
    });
}

以上是关于使用Laravel迁移创建外键时出现MySQL错误的主要内容,如果未能解决你的问题,请参考以下文章

MySQL数据库的Laravel迁移“无法添加外键约束”错误

Laravel 5.2 迁移第二个表时出现数据库迁移错误

laravel 和 artisan 错误无法在迁移时添加外键

尝试迁移 Laravel 数据库时出现错误

SQLSTATE [HY000] Laravel 8 中的外键约束格式错误

尝试添加外键时出现mysql错误