SQLSTATE [HY000]:常规错误:外键定义中有1个未知列“ user_id”

时间:2019-06-10 10:58:19

标签: sql database laravel laravel-artisan

我在运行时遇到此错误:

php artisan migrate:fresh
  

Illuminate \ Database \ QueryException:SQLSTATE [HY000]:常规   错误:外键定义中有1个未知列“ user_id”(SQL:   创建表“ users”(“ id”整数不为null,主键自动递增,   “名称” varchar不为空,“电子邮件” varchar不为空,“用户名” varchar   不为空,“ email_verified_at”日期时间为空,“密码”为varchar不   null,“ remember_token” varchar null,“ created_at” datetime null,   “ updated_at”日期时间为空,外键(“ user_id”)引用   删除级联上的“ users”(“ id”))

我正在关注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');
    }
}

如果我复制并粘贴此代码,则会出现错误。因此,我搜索了stackoverflow,并找到了以下解决方案:

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

这是我的用户表:

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时,我再次遇到此错误。

我该如何解决?

谢谢

4 个答案:

答案 0 :(得分:0)

这里清楚地提到了错误:

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列在查询中不可用。因此,请添加该列或删除此约束代码,然后重试。

答案 1 :(得分:0)

此问题的原因是,配置文件表是在用户表之前创建的。 我有解决问题的技巧。

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

例如让我的文件名像这样

  • 2019_06_10_000001_create_users_table.php
  • 2019_06_10_000002_create_profiles_table.php

运行“ artisan migration or migration:fresh”时会创建第一个用户表

为什么?因为首先创建的迁移文件是用户文件。您应仔细查看

  • 2019_06_10_000001->用户表名
  • 2019_06_10_000002->个人资料表名称

解决方案: 因此,您只需要执行以下操作:重命名“ user”表,并将其命名为比“ profiles”表小的数字。这样就可以解决问题。

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

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

答案 2 :(得分:0)

尝试一下;

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

那是迁移。在能够运行它之前;删除迁移表中“ CreateProfilesTable”的行。

答案 3 :(得分:0)

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

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

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

完整代码:

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