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

时间:2014-03-02 00:50:11

标签: php mysql laravel foreign-keys laravel-eloquent

我已经设置了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我了解到这个错误可能是由于两个列定义不同造成的,但这似乎不是这种情况。

3 个答案:

答案 0 :(得分: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 :(得分: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');
    });
}

答案 2 :(得分:0)

我解决了

Schema::disableForeignKeyConstraints();

在第一次迁移之前和

Schema::enableForeignKeyConstraints();

在上次迁移中

Screenshot