当前位置: 首页 > 知识库问答 >
问题:

SQLSTATE[HY000]:一般错误:外键定义中有1个未知列“user\u id”

邹玄裳
2023-03-14

我在运行时出现以下错误:

php artisan migrate:fresh

Illumb\Database\QueryException:SQLSTATE[HY000]:一般错误:外键定义中有1个未知列“user\u id”(SQL:创建表“users”(“id”integer not null主键自动递增,“name”varchar not null,“email”varchar not null,“username”varchar not null,“email\u verified\u at”datetime null,“password”varchar not null,记住标记“varchar null”,在“datetime null”处创建,在“datetime null”处更新,外键(“用户id”)在删除级联上引用“用户”(“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时,我又犯了这个错误。

我怎样才能解决这个问题?

谢啦

共有3个答案

吉嘉珍
2023-03-14

出现此问题的原因是概要文件表是在用户表之前创建的。我有一个解决问题的诀窍。

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

比如让我的文件名这样

  • 2019_06_10_000001_create_users_table.php
  • 2019_06_10_000002_create_profiles_table.php

第一个用户表是在运行“artisan migrate或migrate:fresh”时创建的

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

  • 2019_06_10_000001

解决方案:所以你只需要这样做:重命名“用户”表,并以比“配置文件”表小的数字命名它。所以问题会解决的。

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

php artisan make:migration create_users_table
php artisan make:migration create_profiles_table
陈翰林
2023-03-14

这里清楚地提到了错误:

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

而且您没有名为user\u 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列在查询中不可用。因此,要么添加that列,要么删除此约束代码,然后重试。

伏星汉
2023-03-14

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

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

属于配置文件表创建架构,而不属于用户表创建架构。

完整代码

// 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');
    });
}
 类似资料:
  • 问题内容: 我收到了这个令人讨厌的错误,尽管我知道为什么要得到它,但我终生无法找到解决方案。 查询包含占位符()。但是要添加这些LIMIT占位符,我需要使用手动方法(),因为否则引擎会将它们转换为字符串。 我没有收到无效的参数数量错误,因此所有占位符均已正确绑定(我认为)。 查询: 除最后两个LIMIT(我与之手动绑定)外,所有占位符值均位于$ criteria中。 问题答案: 您不能使用 和 。

  • 我正在尝试使用artisan创建外键,但出现了此错误。 这是我的迁移: 在批次表中,我使用作为it模型批次。我补充说: 知道如何解决这个错误吗?

  • 我正在使用laravel auth。在注册页面中,用户需要填写姓名、电子邮件和密码才能创建帐户。稍后,用户可以编辑他的个人资料帐户,并插入更多信息,如地址、城市、邮政编码等,但创建帐户只需要它的名字、姓氏、电子邮件和密码。 我使用laravel auth使用下面的代码构建上面的逻辑,但是我在填写表单并单击“创建帐户”后收到错误: SQLSTATE[HY000]:一般错误:1364字段“facebo

  • 我正在尝试使用Laravel 5.8为“users”表创建外键。 Laravel 5.8自动生成的迁移表如下, 然后从我的“存储库”表中,我引用了“用户”表,如下所示, 但我在这段代码上遇到了“一般错误:1215无法添加外键约束”错误。有许多与此问题相关的解决方案。 一般错误:1215无法在laravel中添加外键约束 迁移:无法在laravel中添加外键约束 MySQL数据库发生Laravel迁

  • 试图分配外键,但当你运行迁移,我得到这个这个错误,我不明白是什么问题。 SQLSTATE[HY000]:一般错误:1215无法添加外键约束(SQL:alter table

  • 我试图将一个新表添加到一个已经存在的数据库中,但它总是给我一个错误“外键定义中的未知列'PRODUCT_ID'”。 如有任何帮助,我将不胜感激