Laravel throws errno: 150 «Ограничение внешнего ключа сформировано неправильно», несмотря на правильный синтаксис - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь добавить таблицу, содержащую два внешних ключа, см. Ниже:

Schema::create('semester_cohorts', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->unsignedBigInteger('semester_id');
        $table->unsignedBigInteger('cohort_id');
        $table->timestamps();

        $table->foreign('semester_id')
            ->references('semesters')
            ->on('id')
            ->onDelete('cascade');

        $table->foreign('cohort_id')
            ->references('id')
            ->on('cohorts')
            ->onDelete('cascade');
    });

Я получаю следующее сообщение: PDOException::("SQLSTATE[HY000]: General error: 1005 Can't create table [table name](errno: 150 "Foreign key constraint is incorrectly formed")"), хотя в базе данных существуют соответствующие ссылочные таблицы, существуют нет опечаток в именах и типах первичных / внешних ключей совпадают. Что может вызвать эту проблему? `

Ответы [ 3 ]

4 голосов
/ 28 апреля 2020

В вашем первом внешнем ключе смешаны references и on:

$table->foreign('semester_id')
            ->references('semesters')
            ->on('id')
            ->onDelete('cascade');

должно быть

$table->foreign('semester_id')
            ->references('id')
            ->on('semesters')
            ->onDelete('cascade');
1 голос
/ 28 апреля 2020

Здесь возможны некоторые проблемы:

  • Проверьте типы столбцов для обеих таблиц, типы должны быть одинаковыми
  • Попробуйте разделить миграции. Сначала создайте таблицу semester_cohorts , а затем используйте

    Schema::table('semester_cohorts', function (Blueprint $table) {
       $table->foreign('semester_id')
            ->references('id')
            ->on('semesters')
            ->onDelete('cascade');
    
        $table->foreign('cohort_id')
            ->references('id')
            ->on('cohorts')
            ->onDelete('cascade');
    });
    
0 голосов
/ 28 апреля 2020

У меня действительно была эта проблема, и это из-за типа unsignedBigInteger.

Столбец внешнего ключа должен иметь тот же тип данных, что и первичный ключ, на который он ссылается.

Так что если ваш первичный ключ в таблице semesters & cohorts имеет тип bigIncrements

. Вы должны определить тип внешнего ключа как BigInteger, а затем следовать за unsigned():

  $table->bigIncrements('id');
    $table->bigInteger('semester_id')->unsigned();
    $table->bigInteger('cohort_id')->unsigned();
    $table->timestamps();

Редактировать:

Как сказал Кербхольц, у вас есть ошибка в определении внешних ключей

...