Laravel migration “Cannot add foreign key constrai

2019-08-20 15:30发布

问题:

I am developing a Laravel application. I am using MySQL for the database. I have created a model class and am trying to run the migration on it. But when, I run migration, I am getting error with adding the foreign key constraint. This is what I have done so far.

First I have migrated the built in Laravel user model running this command.

php artisan migrate

The users table was created in the database.

Then I created another model running this command.

php artisan make:model TodoItem -m

Then I added the following code to the migration file.

class CreateTodoItemsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('todo_items', function (Blueprint $table) {
            $table->text('about');
            $table->integer('user_id');
            $table->increments('id');
            $table->timestamps();

            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        });
    }

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

AS you can see above, I am building the relationship between users table and todo_items table by adding a foreign key to the todo_items table. Then, I tried to migrate the TodoItem model by running this command.

php artisan migrate

When I run the command, I got this error.

  Illuminate\Database\QueryException  : SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `todo_items` add constraint `todo_items_user_id_foreign` foreign key (`user_id`) references `users` (`id`) on delete cascade)

  at /var/www/vendor/laravel/framework/src/Illuminate/Database/Connection.php:664
    660|         // If an exception occurs when attempting to run a query, we'll format the error
    661|         // message to include the bindings with SQL, which will make this exception a
    662|         // lot more helpful to the developer instead of just the database's errors.
    663|         catch (Exception $e) {
  > 664|             throw new QueryException(
    665|                 $query, $this->prepareBindings($bindings), $e
    666|             );
    667|         }
    668| 

 Exception trace:

  1   PDOException::("SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint")
      /var/www/vendor/laravel/framework/src/Illuminate/Database/Connection.php:458

  2   PDOStatement::execute()
      /var/www/vendor/laravel/framework/src/Illuminate/Database/Connection.php:458

  Please use the argument -v to see more details.

I did the same in my previous project which is using Postgresql. I was working fine. For this project, I am using MySQL database and now it is giving me the above error.

回答1:

This is because you added $table->integer('user_id'); to your migration file. You must add an unsignedInteger instead of an integer, because the original id column of the users table is unsigned (and both columns must be exactly the same).

[EDIT]

Since Laravel 5.8, the id column type of the default users table is no longer an integer. It is now a bigInteger.



回答2:

Change this

$table->integer('user_id');

To this

$table->unsignedInteger('user_id')->nullable(false);


回答3:

Try running it like this, this should work.

// also, do the unsigned thing the people above me posted

public function up()
{
    Schema::create('todo_items', function (Blueprint $table) {
        $table->text('about');
        $table->integer('user_id');
        $table->increments('id');
        $table->timestamps();

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


回答4:

The issue was that either mysql didn't want foreign keys during table creation, or laravel was issuing them in the wrong order.

In short, this didn't work:

Schema::create('todo_items', function (Blueprint $table) {
    $table->text('about');
    $table->integer('user_id')->unsigned();
    $table->increments('id');
    $table->timestamps();

    $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});

This worked:

  Schema::create('todo_items', function (Blueprint $table) {
    $table->text('about');
    $table->integer('user_id')->unsigned();
    $table->increments('id');
    $table->timestamps();

});

Schema::table('todo_items',  function(Blueprint $table){

    $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});


回答5:

try

    $table->unsignedBigInteger('user_id')->nullable()->index();  
    $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');