Миграция Laravel - нарушение ограничения целостности: 1452 Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполнено

Я пытаюсь запустить миграцию для таблицы inventories что я создал с помощью этой миграции:

    Schema::create('inventories', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('remote_id')->unsigned();
        $table->integer('local_id')->unsigned();
        $table->string('local_type');
        $table->string('url')->nullable()->unique();
        $table->timestamps();
    });

Я пытаюсь добавить запуск миграции, где я добавляю внешний ключ в таблицу:

    Schema::table('inventories', function (Blueprint $table) {
        $table->foreign('local_id')->references('id')->on('contents')->onDelete('cascade');
    });

Но я получаю сообщение об ошибке при попытке запустить миграцию:

[Осветите \ Database \ QueryException]
SQLSTATE [23000]: нарушение ограничения целостности: 1452 Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется (middleton
,#sql-5d6_162a, ОГРАНИЧЕНИЕ inventories_local_id_foreign ИНОСТРАННЫЙ КЛЮЧ (local_id) РЕКОМЕНДАЦИИ contents (id) ON DELETE CASCADE) (SQL: изменить таблицу inventories добавить ограничение inventories_local_id_foreign иностранный ключ (local_id) Рекомендации contents (id) на каскаде удаления)

                                                                                                                                      [PDOException]                                                        

SQLSTATE [23000]: нарушение ограничения целостности: 1452 Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется (middleton
,#sql-5d6_162a, ОГРАНИЧЕНИЕ inventories_local_id_foreign ИНОСТРАННЫЙ КЛЮЧ (local_id) РЕКОМЕНДАЦИИ contents (id) НА УДАЛЕННОМ КАСКАДЕ)

Что я делаю неправильно?

2 ответа

Решение

У вас, вероятно, есть несколько записей в inventories стол с local_id что не имеет соответствующего id в contents Таблица, следовательно, ошибка. Вы можете решить это одним из двух способов:

  • Запустите миграцию с foreign_key_checks выключен. Это отключит ограничения внешнего ключа для существующих строк (если это то, что вы хотите). Это задокументировано здесь
  • Вставьте только те записи, которые имеют соответствующие id поле в contents Таблица. Ты можешь использовать INSERT INTO.. WHERE EXISTS запрос, чтобы отфильтровать записи и вставить только эти записи.

Была такая же проблема. исправил, добавив nullable в поле

Schema::create('table_name', function (Blueprint $table) {
    ...
    $table->integer('some_id')->unsigned()->nullable();
    $table->foreign('some_id')->references('id')->on('other_table');
    ...
});

обратите внимание, что после миграции все существующие строки будут иметьsome_id = NULL

Другие вопросы по тегам