mysql数据库发生laravel迁移“无法添加外键约束”错误

zpqajqem  于 2021-06-23  发布在  Mysql
关注(0)|答案(5)|浏览(352)

我正在开发一个laravel应用程序。我使用mysql作为数据库。我已经创建了一个模型类,并正在尝试对其运行迁移。但在运行迁移时,添加外键约束时出错。这就是我到目前为止所做的。
首先,我迁移了运行这个命令的内置laravel用户模型。

php artisan migrate

用户表是在数据库中创建的。
然后我创建了另一个运行这个命令的模型。

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\u items表添加外键来构建users表和todo\u 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数据库,现在它给了我上面的错误。

83qze16e

83qze16e1#

尝试

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

k5ifujac2#

试着像这样运行,应该可以。
//还有,做我上面的人贴的未签名的东西

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

zwghvu4y3#

这是因为你添加了 $table->integer('user_id'); 到您的迁移文件。您必须添加 unsignedInteger 而不是 integer ,因为 idusers 表是 unsigned (两列必须完全相同)。
[编辑]
自从laravel 5.8以来 id 默认列类型 users 表不再是一个 integer . 它现在是一个 bigInteger .

myss37ts

myss37ts4#

问题是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');
});
hc8w905p

hc8w905p5#

改变这个

$table->integer('user_id');

为了这个

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

相关问题