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

Это миграция с новым столбцом:

Schema::table( 'events', function ( Blueprint $table ) {

     $table->integer( 'category_id' )->unsigned()->after( 'place_id' );
     $table->foreign('category_id')->references('id')->on('categories');
 } );

Когда я запускаю команду миграции, я получаю:

[Illuminate\Database\QueryException]                                                                                                                                           
  SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`meetmount`.`#sql-3c8_424`, CONSTRAINT `events_catego  
  ry_id_foreign` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`)) (SQL: alter table `events` add constraint events_category_id_foreign foreign key (`category_id`) r  
  eferences `categories` (`id`))

А также

[PDOException]                                                                                                                                                                 
  SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`meetmount`.`#sql-3c8_424`, CONSTRAINT `events_catego  
  ry_id_foreign` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`))  

Как я могу решить?

1
Christian Giupponi 4 Янв 2016 в 13:36

2 ответа

Лучший ответ

Причина ошибки могла быть в следующем:

В родительской таблице categories и / или в дочерней таблице events уже есть записи. Поскольку вы хотите сослаться на конкретный столбец родительской таблицы (id), MySQL будет ожидать, что дочерняя таблица будет иметь значение, которое существует в родительской таблице, отсюда нарушение ограничения целостности .

Возможное решение (если родительский объект не пуст) - добавить значение по умолчанию в таблицу events для столбца внешнего ключа:

$table->integer( 'category_id' )->unsigned()->after( 'place_id' );
$table->foreign('category_id')->references('id')->on('categories')->default(1);
1
Ahmad Baktash Hayeri 4 Янв 2016 в 11:09

То же самое произошло и со мной, но я решил это, добавив значение по умолчанию при создании столбца:

$table->integer( 'category_id' )->unsigned()->after( 'place_id' )->default(1);

Убедитесь, что в таблице «категории» есть запись с id = 1.

0
Harold Andres Muñoz 12 Фев 2019 в 16:25