如何解决 SQLSTATE[HY000]: General error: 1824 Failed to open the referenced table in laravel?

Posted

技术标签:

【中文标题】如何解决 SQLSTATE[HY000]: General error: 1824 Failed to open the referenced table in laravel?【英文标题】:How to resolve SQLSTATE[HY000]: General error: 1824 Failed to open the referenced table in laravel? 【发布时间】:2021-10-15 13:56:01 【问题描述】:

我创建了三个迁移表 user_container 表用于存储用户详细信息,admin_table 用于存储管理员详细信息,blog_table 用于存储博客。admin 可以创建博客,这就是为什么我为 admin 与 blogs 表建立外键关系。当我尝试迁移表我收到以下错误

  Illuminate\Database\QueryException 

  SQLSTATE[HY000]: General error: 1824 Failed to open the referenced table 'admin_table' (SQL: alter table `blogs_table` add constraint `blogs_table_admin_id_foreign` foreign key (`admin_id`) references `admin_table` (`id`))

请帮我解决这个问题,我不知道我错在哪里了..

迁移表结构

2021_08_11_170129_create_Blogs_table.php

<?php

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

class CreateBlogsTable extends Migration

    /**
     * Run the migrations.
     */
    public function up(): void
    
        Schema::create('blogs_table', function (Blueprint $table) 
            $table->id();
            $table->string('name');
            $table->string('price');
            $table->string('country');
            $table->longText('description');
            $table->integer('rating');
            $table->longText('image');
            $table->unsignedInteger('admin_id');
            $table->foreign('admin_id')->references('id')->on('admin_table');
            $table->timestamps();
            //$table->softDeletes();
        );
    

    /**
     * Reverse the migrations.
     */
    public function down(): void
    
        Schema::dropIfExists('blogs_table');
    


2021_08_12_121933_create_admin_table.php

<?php

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

class CreateAdminTable extends Migration

    /**
     * Run the migrations.
     */
    public function up(): void
    
        Schema::create('admin_table', function (Blueprint $table) 
            $table->id();
            $table->string('firstName');
            $table->string('lastName');
            $table->string('email')->unique();
            $table->string('mobile');
            $table->string('password');
            $table->timestamps();
            //$table->softDeletes();
        );
    

    /**
     * Reverse the migrations.
     */
    public function down(): void
    
        Schema::dropIfExists('admin_table');
    


【问题讨论】:

错误很明显...您如何引用其他未创建的表?您是先创建blogs_table,然后再创建admin_table,所以当您创建blogs_table 并运行迁移时,它不会存在admin_table 来引用... 【参考方案1】:

您尝试先在博客表上运行迁移,然后在管理表上运行迁移。

Laravel 迁移采用文件开头的时间戳来决定应按顺序首先迁移哪个迁移。

确保在 Blog 表之前创建一个 admin 表(这也适用于任何具有引用的表)。或者只是重命名文件(更改时间戳),例如:

2021_08_12_121933_create_admin_table.php
2021_08_11_170129_create_Blogs_table.php

到这里:

2021_08_11_121933_create_admin_table.php
2021_08_12_170129_create_Blogs_table.php

然后运行 ​​php artisan migrate:fresh 以刷新您的迁移。

【讨论】:

@DevopsTraining 你不应该得到这个解决方案的错误,你需要重命名两个文件 你说的也对,把两个文件都改名也没问题。【参考方案2】:

当您设置外键 $table-&gt;foreign('admin_id')-&gt;references('id')-&gt;on('admin_table'); 时,表 admin_table 还不存在。

将要运行的 admin_table 的迁移名称更改为博客的迁移名称。

2021_08_11_121933_create_admin_table.php

而不是

2021_08_12_121933_create_admin_table.php

【讨论】:

以上是关于如何解决 SQLSTATE[HY000]: General error: 1824 Failed to open the referenced table in laravel?的主要内容,如果未能解决你的问题,请参考以下文章

工匠迁移结果:SQLSTATE [HY000]:一般错误:LUMEN / LARAVEL 上的 1005

PDO 错误:SQLSTATE [HY000]:一般错误:2031

关于“WARN: SQL Error: 1366, SQLState: HY000”错误的解决方案

Yosemite 上的 MAMP - 连接错误:SQLSTATE[HY000] [2002] 没有这样的文件或目录

解决mysql的错误 CDbCommand failed to execute the SQL statement: SQLSTATE[HY000]: General error: 1300 Inva

解决WorkBench执行更新语句时1175 SQLSTATE: HY000 (ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE)