Миграция 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