laravel 一般错误:1824 1824无法打开引用的表

93ze6v8z  于 2023-03-19  发布在  其他
关注(0)|答案(9)|浏览(211)

我试图用php artisan migrate设置我的'books'表的外键和'categories'表,但是我得到了下面的错误:

Illuminate\Database\QueryException 

  SQLSTATE[HY000]: General error: 1824 Failed to open the referenced table 'categories' (SQL: alter table `books` add constraint `books_category_id_foreign` foreign key (`category_id`) references `categories` (`id`))

书籍迁移文件:

public function up()
{
    Schema::create('books', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('category_id')->unsigned();
        $table->foreign('category_id')->references('id')->on('categories');
        $table->string("image");
        $table->string("title");
        $table->string("description")->nullable();
        $table->string("author");
        $table->string("cover");
        $table->integer("nod")->nullable();// Number of downloads
        $table->integer("rating")->nullable();
        $table->timestamps();
    });
}

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

类别迁移文件:

public function up()
{
    Schema::create('categories', function (Blueprint $table) {
        $table->increments('id');
        $table->string("title");
        $table->string("image");
        $table->timestamps();
    });
}

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

我真的需要帮助,这在我的移动的应用程序API使用。我希望有人能帮助我。

syqv5f0l

syqv5f0l1#

问题出在迁移本身,请仔细查看

SQLSTATE[HY000]: General error: 1824 Failed to open the referenced table 'categories' (SQL: alter table `books` add constraint `books_category_id_foreign` foreign key (`category_id`) references `categories` (`id`))

您试图打开categories表,但它基本上不存在或尚未创建。如果您使用图形用户界面,如HeidiSQL或Navicat或PMA,您将能够看到它。
Laravel迁移采用文件开头的时间戳来决定顺序中应首先迁移哪个迁移。
确保在创建books表之前先创建categories表(这也适用于任何有引用的表)。或者简单地重命名文件(更改时间戳),例如:

2020_01_01_1234_create_books_table.php
2020_01_01_5678_create_categories_table.php

到这个

2020_01_01_1234_create_categories_table.php
2020_01_01_5678_create_books_table.php

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

pw136qt2

pw136qt22#

您尝试在创建类别表之前获取图书类别,但图书表无法理解您引用的内容。
溶液#1
在图书表之前声明类别表,只需在迁移文件名中重命名日期。类别表必须在图书表之前创建。
溶液#2
创建类别表后创建引用。
从图书迁移中删除$table->foreign('category_id')->references('id')->on('categories');,并在更新类别表后创建引用。
类别迁移文件:

public function up()
{
    Schema::create('categories', function (Blueprint $table) {
        $table->increments('id');
        $table->string("title");
        $table->string("image");
        $table->timestamps();
    });

    Schema::table('books', function (Blueprint $table) {
        $table->foreign('category_id')->references('id')->on('categories');
    });
}
    

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

主要思想是在创建所有表时创建所有关系。另外,使用php artisan migrate:fresh快速擦除和重新创建表

bq3bfh9z

bq3bfh9z3#

我昨天和你们也遇到了同样的问题,后来我看到了我的错误,我明白了问题的原因,有很多因素要考虑
1.确保父表(categories)的日期早于子表(books)的日期,以便在迁移过程中首先创建父表,因为子表可能要引用不存在的表中的id。
1.请确保遵循命名约定

  • 你可以像这样重构你的迁移文件
    **$表-〉外部ID(“类别ID ")-〉受约束(”类别“);**或
    $table-〉外部ID(“类别ID ")-〉受约束();

我的迁移文件之一的示例

public function up()
{
    Schema::create('project_details', function (Blueprint $table) {
        $table->engine = 'InnoDB';
        $table->charset = 'utf8mb4';
        $table->collation = 'utf8mb4_unicode_ci';
        $table->id();
        $table->foreignId('project_id')->constrained()->onDelete('cascade');
        $table->string('name', 150)->nullable();
        $table->string('description', 600)->nullable();
        $table->string('location', 150)->nullable();
        $table->integer('completed_percent')->nullable()->default(0);
        $table->foreignId('manager_id')->constrained('staffs');
        $table->foreignId('sponsor_id')->constrained('sponsors')->nullable();
        $table->foreignId('donor_id')->constrained('sponsors')->nullable();
        $table->foreignId('mda_id')->constrained('sponsors')->nullable();
 });
}
dz6r00yl

dz6r00yl4#

我刚才也犯了同样的错误。
它与创建这些迁移有关。
我遇到的问题是因为我手动重构了表名,没有考虑表之间的连接,并立即尝试迁移它们。
我所做的解决方案是手动删除迁移,然后使用php make:magirate重新创建它们。

jvidinwx

jvidinwx5#

在我看来,您需要将SQL的引擎更改为InnoDB,这个问题困扰了我很长时间,您需要做的就是添加

<?php 
  $table->engine = 'InnoDB';
?>

到表迁移文件
参考:https://web-brackets.com/discussion/4/-solved-sqlstate-hy000-general-error-1824-failed-to-open-the-referenced-table-alter-on-foreign-key-

jucafojl

jucafojl6#

您引用其“ID”的表(Categories)未创建或创建在“books”表之后。您可以手动删除这两个表,然后以“Categories”为第一个重新创建它们,或者您可以手动将“Categories”的日期更改为“books”之前的日期,这样就可以开始了。

8ljdwjyq

8ljdwjyq7#

请确保您的数据库中有这样的表。如果您使用大量数据库,则需要指定要约束的数据库
连接数据库=数据库::连接('连接名称')-〉getDatabaseName();$table-〉外部(“类别标识”)-〉引用(“标识”)-〉在(“$connection_db.categories”)上;

mpgws1up

mpgws1up8#

确保使用相同的引擎创建两个表,在我的例子中,我使用两个不同的引擎(MyISAM和InnoDB)创建了两个表,将两个表引擎都改为InnoDB就可以了。

mrfwxfqh

mrfwxfqh9#

必须首先为引用的表创建迁移文件,例如
1.产物迁移
1.订单迁移
那么你可以使用php工匠迁移订单相关的产品.如果你创建这样:
1.订单迁移
1.产物迁移
这将抛出错误字段以打开引用表

相关问题