将Laravel MySQL迁移到Postgresql时出现索引错误

时间:2019-10-19 20:13:21

标签: laravel postgresql

我已经为MySQL数据库写了大约10个Laravel迁移。我现在想将数据库换成Postgresql数据库,但索引似乎有些麻烦。

我遵循了有关投票模块的教程,因此我没有自己编写迁移,但是在MySQL上迁移时它们都能正常工作。

我得到的错误如下;

SQLSTATE[42P07]: Duplicate table: 7 ERROR:  relation "poll_id" already exists (SQL: create index "poll_id" on "gp_poll_votes" ("poll_id"))

没有重复的表,这些迁移在过去一年左右的时间内一直有效。

它被卡住的迁移如下;

Schema::create('gp_poll_votes', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->bigInteger('poll_id')->unsigned();
    $table->bigInteger('poll_option_id')->unsigned();
    $table->bigInteger('vote_count');
    $table->timestamps();

    $table->index('poll_id', 'poll_id');
    $table->index('poll_option_id', 'poll_option_id');
    $table->foreign('poll_id')->references('id')->on('gp_polls')->onDelete('cascade');
    $table->foreign('poll_option_id')->references('id')->on('gp_poll_options')->onDelete('cascade');
});

还有2个与投票相关的迁移,它们是在错误的表决之前进行的;

Schema::create('gp_polls', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->tinyInteger('status')->nullable(false)->default(1);
    $table->timestamps();
});

Schema::create('gp_poll_options', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->bigInteger('poll_id')->unsigned();
    $table->bigInteger('image_id')->unsigned();
    $table->tinyInteger('status')->nullable(false)->default(1);
    $table->timestamps();

    $table->index('poll_id', 'poll_id');
    $table->index('image_id', 'image_id');
    $table->foreign('image_id')->references('id')->on('gp_submit_images');
    $table->foreign('poll_id')->references('id')->on('gp_polls')->onDelete('cascade');
});

1 个答案:

答案 0 :(得分:1)

在Postgres中,索引名称在整个数据库中必须是唯一的,在MySQL中似乎无关紧要。

您可以创建索引而无需传递第二个参数,即索引名称,Blueprint将为您创建一个更唯一的索引名称。

$table->index('poll_id'); // "gp_poll_options_poll_id_index"

它将使用类似"{$prefix}{$table}_{$column}_{$typeOfIndex}"的方式为您生成索引名称。