一般错误:1824 无法打开引用的表
Posted
技术标签:
【中文标题】一般错误:1824 无法打开引用的表【英文标题】:General error: 1824 Failed to open the referenced table 【发布时间】:2020-07-04 16:02:13 【问题描述】:我正在尝试使用 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 中使用。我希望有人可以帮助我。
【问题讨论】:
我今天遇到了这个问题,因为我将 InnoDB 引擎表连接到 MyISAM 引擎表。将 MyISAM 更改为 InnoDB,它们立即连接。另外,父表问题在于迁移本身。仔细看看这个
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 等 GUI,您将能够看到它。
Laravel 迁移使用文件开头的时间戳来决定应该按顺序首先迁移哪个迁移。
确保您首先在书表之前创建类别表(这也适用于任何具有参考的表)。或者只是重命名文件(更改时间戳),例如:
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
以刷新您的迁移。
【讨论】:
【参考方案2】:从昨天开始我遇到了同样的问题,后来我看到了我的错误,我能够理解问题的原因。 需要考虑的因素太多了
-
确保父表(类别)的日期早于子表(书籍)的日期,以便在迁移期间,将首先创建父表,因为子表可能希望在不存在的表。
确保遵循命名约定
你可以像这样重构你的迁移文件
$table->foreignId('category_id')->constrained('categories'); 或
$table->foreignId('category_id')->constrained();
我的一个迁移文件示例
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();
);
【讨论】:
您好,如何更改日期以使引用的表更早?! 重命名迁移文件,查看我的迁移文件!migration files从链接中查看我的迁移文件,你会发现上面的那些,就像项目表一样,我手动将它们重命名为2019 【参考方案3】:您在创建类别表之前尝试获取图书类别,而图书表无法理解您引用的内容。
解决方案 #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
快速擦除和重新创建表
【讨论】:
【参考方案4】:我刚才遇到了同样的错误。
它与创建这些迁移有关。
我遇到的问题是因为我手动重构了表名并且没有处理表之间的连接并立即尝试迁移它们。
我为我所做并为我工作的解决方案是我手动删除了迁移并使用php make:magirate
再次创建它们。
【讨论】:
您可以添加一些关于您运行的操作和命令的详细信息,并可能使其适应 Veasna WT 问题【参考方案5】:您引用其“id”的表(类别)要么未创建,要么在“books”表之后创建。您可以手动删除这两个表并重新创建它们,首先使用“Categories”,或者您可以手动将“Categories”的日期更改为“books”之前的日期,一切顺利。
【讨论】:
【参考方案6】:在我看来,您需要将 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-
【讨论】:
有趣!我改变了这个: $table->engine = 'MyISAM'; 这取决于你的数据库引擎【参考方案7】:在我的例子中,我使用类而不是表名定义了约束关系,这就是它抛出错误的原因。
$table->foreignId('designation_id')->constrained(Designation::class)->cascadeOnDelete();
适当改写后的样子
$table->foreignId('designation_id')->constrained('designations')->cascadeOnDelete();
【讨论】:
以上是关于一般错误:1824 无法打开引用的表的主要内容,如果未能解决你的问题,请参考以下文章
在access vba中输出多个报告会导致错误3014,打开的表太多
PHP 警告:odbc_connect():SQL 错误:[Microsoft][ODBC Microsoft Access Driver]一般错误无法打开临时注册表项(易失性)