Внешний ключ при миграции Laravel, вызывающий общую ошибку 1215
Я пытаюсь создать несколько таблиц с внешними ключами, используя миграцию Laravels. У меня есть проблемы с таблицей миграции, как так
Schema::create('problems', function($table)
{
$table->increments('id');
$table->integer('created_by')->unsigned();
$table->foreign('created_by')->references('id')->on('users');
$table->integer('category')->unsigned();
$table->foreign('category')->references('id')->on('categories');
$table->timestamps();
});
Миграция категорий
Schema::create('categories', function($table)
{
$table->increments('id');
$table->string('category_name');
$table->timestamps();
});
Мой первый внешний ключ в миграции пользователей работает нормально, но как только он попадает во внешний ключ для идентификатора категории, он дает
SQLSTATE HY000 Общая ошибка 1215 Невозможно объяснить, что противоречит внешнему индексу (SQL; изменить таблицу "проблемы" добавить ограничение problem_category_foreign внешний ключ ("категория") ссылается на "категории" ("идентификатор"))
(Я не могу правильно читать по-французски, и я не знаю, почему это дает мне ошибки на французском языке. Я не смог найти способ изменить его, так как я не француз, и не могу этого понять)
Я не понимаю, почему это сработало бы для одного, а не для другого, когда по сути это одно и то же.
4 ответа
Вы должны убедиться, что порядок переноса файлов работает. Например, вы не можете создать таблицу проблем с внешним ключом, который ссылается на id
на таблицу категорий, прежде чем вы на самом деле создать саму таблицу категорий.
Для французской проблемы ошибки, посмотрите на этот вопрос.
Вы должны изменить порядок миграций
|-database/
|--migrations/
|---2015_02_02_141725_create_problems_table.php
|---2015_03_01_234626_create_categories_table.php
Должно быть:
|-database/
|--migrations/
|---2015_01_01_234626_create_categories_table.php
|---2015_02_02_141725_create_problems_table.php
В заключение:
php artisan migrate
Мне пришлось добавить внешний ключ в другой файл миграции, чтобы устранить проблему.
У меня была такая же проблема несколько дней назад, и проблема была в следующем:
на использование $table->increments('id');
, он генерирует unsigned
целое число длиной 10. а также $table->integer('user_id')
генерировать не unsigned
целое число с длиной 11.
Чтобы исправить это, вы можете отказаться от unsigned
и установить таблицу всех полей, которые будут связаны с другими только как auto increment
поле, как это:
$table->integer('id', true); // true represents the auto increment type
И, конечно же, установить $table->engine = 'InnoDB';
,