迁移不遵循时间戳顺序

qyyhg6bp  于 2021-06-21  发布在  Mysql
关注(0)|答案(0)|浏览(220)

我正在使用laravel5.4来运行我的迁移。我已经读到执行顺序遵循迁移文件的时间戳。但事实并非如此,因为我收到以下错误:

SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint 
(SQL: alter table `aplicantes` add constraint `aplicantes_pais_id 
_foreign` foreign key (`pais_id`) references `pais` (`id`))

以下是我的迁移文件:

2014_01_01_100004_create_pais_table.php
2014_01_01_100005_create_departamentos_table.php
2014_01_01_100006_create_aplicantes_table.php

这就是移民抱怨的地方:

class CreateAplicantesTable extends Migration 
{
    /**
    * Run the migrations.
    *
    * @return void
    */
    public function up()
    {
        Schema::create('aplicantes', function (Blueprint $table) {
            $table->increments('id');
            $table->string('nombre');
            $table->unsignedInteger('pais_id');
            $table->foreign('pais_id')->references('id')->on('pais');
            $table->timestamps();
        });
    }
}

这是我的pais迁移:

public function up()
{
    Schema::create('pais', function (Blueprint $table) {
        $table->increments('id');
        $table->string('nombre');
        $table->timestamps();
    });
}

当我检查数据库时,只有 aplicantes 表,这是顺序中的第三个。我想这就是迁移失败的原因,因为 aplicantes 表是首先创建的,它引用了一个尚不存在的表。
编辑:
我已经更新了迁移,为每个表的外键创建了一个单独的文件。我遇到了一个错误migrate:refresh,在删除外键时发生访问冲突,我认为这是因为相同的原因:迁移是按字母顺序执行的,而不是按时间戳执行的。
更新:
我不得不重命名每一个迁移文件,现在它似乎工作。似乎migrate只关心迁移文件的命名约定中的days字段,而不是我正在处理的秒。尽管我在migrations表中看到了正确的迁移顺序,但当我有这样的迁移文件时,它会抱怨删除外键:

class AddAplicantesForeignKey extends Migration
{
/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::table('aplicantes', function (Blueprint $table) {
        $table->foreign('pais_id')->references('id')->on('pais')->onDelete('cascade');
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::table('aplicantes', function(Blueprint $table)
    {           
        $table->dropForeign('pais_id'); 
    });
}

}
我通过关闭迁移创建表中的外键约束检查来禁用投诉:

public function down()
{
    DB::statement('SET FOREIGN_KEY_CHECKS = 0');
    Schema::dropIfExists('aplicantes');
}

我对这个解决方案不满意,但似乎只有这样。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题