#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`;