SQLSTATE[HY000]: General error: 1 unknown column "user_id" in foreign key definition

SQLSTATE[HY000]: General error: 1 unknown column "user_id" in foreign key definition

当我 运行 :

时出现此错误
php artisan migrate:fresh

Illuminate\Database\QueryException : SQLSTATE[HY000]: General error: 1 unknown column "user_id" in foreign key definition (SQL: create table "users" ("id" integer not null primary key autoincrement, "name" varchar not null, "email" varchar not null, "username" varchar not null, "email_verified_at" datetime null, "password" varchar not null, "remember_token" varchar null, "created_at" datetime null, "updated_at" datetime null, foreign key("user_id") references "users"("id") on delete cascade))

我在youtube上关注一个视频教程,教程的代码是这样的:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateProfilesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('profiles', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('user_id');
            $table->string('title')->nullable();
            $table->text('description')->nullable();
            $table->string('url')->nullable();
            $table->string('image')->nullable();
            $table->timestamps();

            $table->index('user_id');
        });
    }

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

如果我复制并粘贴此代码,则会出现错误。所以我在 Whosebug 上搜索并找到了这个解决方案:

public function up()
    {
        Schema::create('profiles', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('user_id');
            $table->string('title')->nullable();
            $table->text('description')->nullable();
            $table->string('url')->nullable();
            $table->string('image')->nullable();
            $table->timestamps();

            $table->index('user_id');             
        });

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

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

这是我的用户 table:

public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->string('username')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();

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

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

但是今天,当我 运行 php artisan migrate:fresh 我又遇到了这个错误。

我该如何解决?

谢谢

错误在这里说得很清楚:

foreign key("user_id") references "users"("id") on delete cascade)

并且您没有名称为 user_id

的列

语法是:

CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name (columns)  <-- this must be a column in the table
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action

但在您的情况下 user_id 列在查询中不可用。因此,要么添加该列,要么删除该约束代码,然后重试。

此问题的原因是配置文件 table 是在用户 table 之前创建的。 我有解决问题的窍门。

您应该重命名迁移目录中的迁移文件。

例如让我的文件名是这样的

  • 2019_06_10_000001_create_users_table.php
  • 2019_06_10_000002_create_profiles_table.php

第一个用户 table 是在您 运行 "artisan migrate or migrate:fresh"

时创建的

为什么?因为第一个创建的迁移文件是用户 file.You 应该仔细看

  • 2019_06_10_000001 -> 用户 table 姓名
  • 2019_06_10_000002 -> 配置文件 table 名称

解法: 所以你只需要这样做:重命名 "user" table 并将其命名为小于 "profiles" table.So 问题将解决的数字。

其他解决方案: 运行 分别删除此命令后的所有迁移文件。

php artisan make:migration create_users_table
php artisan make:migration create_profiles_table

试试这个;

public function up()
{
    Schema::dropIfExists('profiles');
    Schema::create('profiles', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->unsignedBigInteger('user_id');
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        $table->string('title')->nullable();
        $table->text('description')->nullable();
        $table->string('url')->nullable();
        $table->string('image')->nullable();
        $table->timestamps();

        $table->index('user_id');             
    });
}

那就是迁移。在你能够 运行 之前;在迁移 table.

中删除 'CreateProfilesTable' 的行

正如其他人所提到的,user_id 不是您的 users table 中的列,但您正试图在其上创建索引。这一行:

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

属于 profiles table 创建模式,而不属于 users table 创建模式。

完整代码:

// create_users_table.php
public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->string('username')->unique();
        $table->timestamp('email_verified_at')->nullable();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });
}

// create_profiles_table.php   <-- migrate AFTER users table
public function up()
{
    Schema::create('profiles', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->unsignedBigInteger('user_id');
        $table->string('title')->nullable();
        $table->text('description')->nullable();
        $table->string('url')->nullable();
        $table->string('image')->nullable();
        $table->timestamps();

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