我已经为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');
});
答案 0 :(得分:1)
在Postgres中,索引名称在整个数据库中必须是唯一的,在MySQL中似乎无关紧要。
您可以创建索引而无需传递第二个参数,即索引名称,Blueprint将为您创建一个更唯一的索引名称。
$table->index('poll_id'); // "gp_poll_options_poll_id_index"
它将使用类似"{$prefix}{$table}_{$column}_{$typeOfIndex}"
的方式为您生成索引名称。