Общая ошибка: 3730 не удается удалить таблицу «вопросники», на которую ссылается ограничение внешнего ключа (SQL: удалить таблицу, если существует «вопросники`) Laravel

#laravel

#laravel

Вопрос:

У меня проблема, когда я откатываю свои доски. Это выглядит следующим образом:

 SQLSTATE[HY000]: General error: 3730 Cannot drop table 'questionnaires' referenced by a foreign key constraint 'questions_questionnaire_id_foreign' on table 'questions'. (SQL: drop table if exists `questionnaires`)
  

Для этого у меня задействованы 2 таблицы: вопросник и вопрос.

Question

 lass CreateQuestionsTable extends Migration{
  public function up(){
    Schema::create('questions', function (Blueprint $table) {
      $table->id();
      $table->unsignedBigInteger('questionnaire_id');

      $table->text('description');
      $table->text('iframe');
      $table->text('image')->nullable();
      $table->timestamps();
    });
  }

  public function down(){
    Schema::table('questions', function (Blueprint $table) {
      $table->dropColumn('questionnaire_id');
      $table->dropForeign('questions_questionnaire_id_foreign');
    });
    Schema::dropIfExists('questions');
  }
}
  

Questionnaire

 class CreateQuestionnairesTable extends Migration{
  public function up(){
    Schema::create('questionnaires', function (Blueprint $table) {
      $table->id();
      $table->unsignedBigInteger('user_id');
      $table->string('title');
      $table->string('description');
      $table->timestamps();
    });
  }

  public function down(){
    Schema::dropIfExists('questionnaires');
  }
}
  

А затем добавьте анкету FK в таблицу вопросов. Изменить таблицу

 class AddToQuestionnaireIdToQuestionsTable extends Migration{
  public function up(){
    Schema::table('questions', function (Blueprint $table) {
      $table->foreign('questionnaire_id')->references('id')->on('questionnaires')
        ->onDelete('cascade')
        ->onUpdate('cascade');
    });
  }
  public function down(){
    Schema::dropIfExists('questions');
  }
}
  

Однако при откате я получаю вышеупомянутую ошибку. Что я делаю не так?

Ответ №1:

Вы удаляете таблицу вопросов в неправильном месте. Вы должны откатить только то, что вы сделали откат вперед.

Question : если вы создали таблицу, здесь вы удаляете таблицу.

 Class CreateQuestionsTable extends Migration
{
    public function up()
    {
        Schema::create('questions', function (Blueprint $table)
        {
            $table->id();
            $table->unsignedBigInteger('questionnaire_id');

            $table->text('description');
            $table->text('iframe');
            $table->text('image')->nullable();
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('questions');
    }
}

  

ForeigKey : если вы создали столбец и / или внешний ключ, удалите его здесь.

 class AddToQuestionnaireIdToQuestionsTable extends Migration
{
    public function up()
    {
        Schema::table('questions', function (Blueprint $table)
        {
            $table->foreign('questionnaire_id')
                ->references('id')
                ->on('questionnaires')
                ->onDelete('cascade')
                ->onUpdate('cascade');
        });
    }

    public function down()
    {
        Schema::table('questions', function (Blueprint $table)
        {
            $table->dropForeign('questions_questionnaire_id_foreign');
            $table->dropColumn('questionnaire_id');
        });
    }
}
  

Комментарии:

1. У меня та же ошибка… Должен ли я удалить базу данных и выполнить миграцию с нуля?

2. Да, попробуйте это. Если это работает, вероятно, таблица миграции не синхронизирована. Это может произойти, когда генерируются ошибки такого типа.

Ответ №2:

Если вы хотите удалить таблицу и получить ошибку внешнего ключа, выполните следующие действия в SQL😂

 set foreign_key_checks=0;
drop table `yourSchema`.`yourTable`;