Ошибка с индексом при преобразовании миграций Laravel mysql в postgresql - PullRequest
0 голосов
/ 19 октября 2019

Я написал около 10 миграций Laravel для базы данных MySQL. Теперь я хочу переключить свою базу данных на базу данных 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 Ответ

1 голос
/ 19 октября 2019

В Postgres имена индексов должны быть уникальными для всей базы данных, как это может показаться, в MySQL это не имеет значения.

Вы можете создавать свои индексы, не передавая второй аргумент, имяindex, и Blueprint создаст для вас более уникальное имя индекса.

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

Для создания имени индекса будет использоваться что-то вроде "{$prefix}{$table}_{$column}_{$typeOfIndex}".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...