Laravel MySQL数据库出现“无法添加外键约束”错误

时间:2018-08-08 08:08:00

标签: mysql laravel foreign-keys laravel-migrations

我正在开发Laravel应用程序。我正在使用MySQL作为数据库。我创建了一个模型类,并试图在其上运行迁移。但是,当我运行迁移时,添加外键约束时出现错误。这是我到目前为止所做的。

首先,我迁移了运行此命令的内置Laravel用户模型。

php artisan migrate

users表是在数据库中创建的。

然后我创建了另一个运行此命令的模型。

php artisan make:model TodoItem -m

然后我将以下代码添加到迁移文件中。

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');
    }
}

正如您在上面看到的那样,我通过在todo_items表中添加外键来建立users表和todo_items表之间的关系。然后,我尝试通过运行此命令来迁移TodoItem模型。

php artisan migrate

运行命令时,出现此错误。

  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.

在上一个使用Postgresql的项目中,我做了同样的事情。我工作很好对于这个项目,我正在使用MySQL数据库,现在它给了我上面的错误。

5 个答案:

答案 0 :(得分:5)

这是因为您在迁移文件中添加了$table->integer('user_id');。您必须添加unsignedInteger而不是integer,因为id表的原始users列为unsigned(并且两列必须完全相同)。

答案 1 :(得分:0)

更改此

$table->integer('user_id');

对此

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

答案 2 :(得分:0)

尝试像这样运行它,这应该可以工作。

//也要做我上面的人张贴的未签名的事情

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');
    });
}

答案 3 :(得分:0)

问题是,要么mysql在创建表期间不希望使用外键,要么laravel以错误的顺序发出了外键。

简而言之,这是行不通的:

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');
});

这有效:

  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');
});

答案 4 :(得分:0)

尝试

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