Приведенный ниже скрипт миграции без проблем работал в старой версии Laravel, но я добавил его в свой новый Laravel 5.8 и запустил скрипт. Я получаю Error: foreign key was not formed correctly
Миграция оценки:
public function up() {
Schema::create('evaluation', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned()->index();
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
}
Миграция пользователей:
public function up() {
Schema::create('users', function (Blueprint $table) {
$table->bigIncrements('id');
$table->timestamps();
});
}
@BillKarwin, конечно, ты хочешь, чтобы я поделился схемой для этого?
Это было бы полезно, так как мы подтверждаем, что это целое число без знака и первичный ключ.
Вам также может понравиться контрольный список, который я внес для внешних ключей: stackoverflow.com/a/4673775/20860
@BillKarwin Я добавил таблицу users, вы можете проверить сейчас?
Я не эксперт по laravel, но похоже, что users.id будет BIGINT, но вы объявляете evaluation.user_id как INT UNSIGNED? Это не сработает. Они должны быть точно такого же типа данных.
Ага, я нашел блог, который подтверждает, что тип приращений Laravel по умолчанию будет беззнаковым. Но вы должны объявить столбец внешнего ключа как bigInteger, чтобы он соответствовал размеру первичного ключа, на который он ссылается.
Также я не уверен, что в синтаксисе Laravel bigIncrements неявно объявляет user.id первичным ключом этой таблицы? Внешний ключ должен ссылаться на столбец, который является первичным ключом или уникальным ключом.
@BillKarwin это точная причина, по которой я получаю сообщение об ошибке. Я изменил тип данных, и ошибка исчезла. Большое спасибо, приятель. Вы можете поместить решение в качестве ответа.
@BillKarwin Я изменил user_id в коде миграции на $table->unsignedBigInteger('user_id');, теперь он работает нормально.






Как мы обсуждали в комментариях выше, столбец внешнего ключа должен иметь тот же тип данных, что и первичный ключ, на который он ссылается.
Вы объявили свой первичный ключ user.id как $table->bigIncrements('id'), который становится BIGINT UNSIGNED AUTO_INCREMENT в синтаксисе MySQL.
Вы должны объявить внешний ключ как $table->unsignedBigInteger('user_id'), который станет BIGINT UNSIGNED в MySQL, что сделает его совместимым с внешним ключом для столбца user.id.
Ага! unsignedBigInteger, не просто bigInteger!
Используя ларавель 5.5. Этот метод все еще терпит неудачу. Я даже выделил схему для объявления внешних ключей. Все еще не повезло
@S.Domeng, я предлагаю вам просмотреть контрольный список здесь. Если это все еще не удается, попробуйте задать новый вопрос и показать, что вы пробовали. Вы не получите никаких полезных ответов, если скажете только «это терпит неудачу.». Вы должны показать, что вы пробовали, И показать результат SHOW CREATE TABLE для обеих таблиц и показать точное сообщение об ошибке, которое вы получили.
Спасибо @BillKarwin, но я в разделе комментариев. Я не уверен, что объяснять вещи здесь - правильный способ спросить. Двигаясь вперед, я понял проблему ... Ограничение внешнего ключа с моей стороны Исправлено путем создания имени файла справочной таблицы миграции во множественном числе. Произнесите create_users_table. Моя ошибка в том, что у меня единственное имя create_user_table.
Отредактировано: не уверен, что это тот, который ограничивает внешний ключ в моем конце. Тем не менее, это соглашение из документации. Однако я также перезапустил свой сервер. Я использую Ларагон. Вы можете сделать это с помощью XAMPP, WAMP и даже в Vagrant.
update your `integer('user_id')` to `bigInteger('user_id')`
public function up() {
Schema::create('evaluation', function (Blueprint $table) {
$table->increments('id');
$table->bigInteger('user_id')->unsigned()->index();
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
}
Существует ли таблица
usersдо того, как вы запустите это? Вы не можете объявить ссылку внешнего ключа на таблицу до ее существования.