我试图在Laravel中创建外键,但是当我使用artisan迁移我的表时,我抛出了以下错误:

[Illuminate\Database\QueryException]
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL
: alter table `priorities` add constraint priorities_user_id_foreign foreign 
key (`user_id`) references `users` (`id`))     

我的迁移代码如下:

优先级迁移文件

public function up()
{
    //
    Schema::create('priorities', function($table) {
        $table->increments('id', true);
        $table->integer('user_id');
        $table->foreign('user_id')->references('id')->on('users');
        $table->string('priority_name');
        $table->smallInteger('rank');
        $table->text('class');
        $table->timestamps('timecreated');
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    //
    Schema::drop('priorities');
}

用户迁移文件

public function up()
{
    //
    Schema::table('users', function($table)
    {
    $table->create();
    $table->increments('id');
    $table->string('email');
    $table->string('first_name');
    $table->string('password');
    $table->string('email_code');
    $table->string('time_created');
    $table->string('ip');
    $table->string('confirmed');
    $table->string('user_role');
    $table->string('salt');
    $table->string('last_login');

    $table->timestamps();
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    //
        Schemea::drop('users');
}

关于我做错了什么,我现在想要得到这个,因为我有很多表,我需要创建例如用户,客户端,项目,任务,状态,优先级,类型,团队。理想情况下,我想创建表持有这些数据与外键,即clients_project和project_tasks等。

希望有人能帮我开始。


当前回答

在我的例子中,问题是主表中已经有记录,我强制新列不为NULL。因此,在新列中添加->nullable()就成功了。在这个问题的例子中是这样的:

表- >美元整数(user_id) - >无符号()——> nullable ();

or:

表- > unsignedInteger (user_id) - > nullable ();

希望这能帮助到一些人!

其他回答

我用Laravel 5做数据透视表时也犯了同样的错误,我的问题是我没有

->删除('瀑布');

分两步添加它,最好让它也是无符号的:

public function up()
{
    Schema::create('priorities', function($table) {
        $table->increments('id', true);
        $table->integer('user_id')->unsigned();
        $table->string('priority_name');
        $table->smallInteger('rank');
        $table->text('class');
        $table->timestamps('timecreated');
    });

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

}

在我的例子中,问题是用户表的自动生成迁移正在设置中

...
$table->bigIncrements('id');
...

所以我必须改变列的类型


$table->bigInteger('id');

使我的迁移与外键工作。

这是laravel 5.8.2

在我的例子中,问题是主表中已经有记录,我强制新列不为NULL。因此,在新列中添加->nullable()就成功了。在这个问题的例子中是这样的:

表- >美元整数(user_id) - >无符号()——> nullable ();

or:

表- > unsignedInteger (user_id) - > nullable ();

希望这能帮助到一些人!

我认为这里的答案中遗漏了一件事,如果我错了请纠正我,但是外键需要在数据透视表中被索引。至少在mysql中是这样的。

public function up()
{
    Schema::create('image_post', function (Blueprint $table) {
        $table->engine = 'InnoDB';
        $table->increments('id');
        $table->integer('image_id')->unsigned()->index();
        $table->integer('post_id')->unsigned()->index();
        $table->timestamps();
    });

    Schema::table('image_post', function($table) {
        $table->foreign('image_id')->references('id')->on('image')->onDelete('cascade');
        $table->foreign('post_id')->references('id')->on('post')->onDelete('cascade');
    });

}