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

6
我有一个Laravel应用程序,并且我正在使用Sentry 2进行用户认证。我有一个名为Post的模型,以及默认的sentry 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错误:

[Illuminate\Database\QueryException]
SQLSTATE[HY000]: General error: 1005 Can't create table 'blog.dev.#sql-3bb_2d' (errno: 150) (SQL: alter table posts add constraint posts_user_id_foreign foreign key (user_id) references users (id))

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

从谷歌上我了解到这个错误可能是由于两个列定义不同造成的,但这似乎不是这里的情况。

3个回答

8

外键应该已经在数据库中存在,因此建议采取两步。同时,建议将列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');
    });
}

1

我用以下方法解决了问题

Schema::disableForeignKeyConstraints();

在第一次迁移之前和

Schema::enableForeignKeyConstraints();

在上一次迁移中

屏幕截图


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接