миграция внешнего ключа - PullRequest
0 голосов
/ 24 мая 2019

Это моя students миграция, и я хочу иметь внешний ключ с именем subject_id:

public function up()
{
    Schema::create('students', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('first_name');
        $table->string('last_name');
        $table->string('student_code');
        $table->string('national_code');
        $table->integer('subject_id')->unsigned();
        $table->foreign('subject_id')
            ->references('id')->on('subjects');
        $table->timestamps();
    });
}

и это моя subjects миграция:

public function up()
{
    Schema::create('subjects', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('title');
        $table->timestamps();
    });
}

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

Illuminate\Database\QueryException  : SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table students add constraint students_subject_id_foreign foreign key (subject_id) references subjects (id))

Ответы [ 3 ]

1 голос
/ 24 мая 2019

Итак, ваша subjects таблица id имеет BIG INT тип данных, subject_id должен иметь тот же тип данных.

Используйте $table->unsignedBigInteger('subject_id'); вместо.

Ссылка :

столбец внешнего ключа должен иметь одинаковый тип данных + одинаковую длину + тот же масштаб, что и у соответствующего ссылочного столбца

1 голос
/ 24 мая 2019

Похоже, ваша проблема в subject_id определении.Локальный и внешний ключ должны быть одного типа, в нашем случае:

$table->unsignedBigInteger('subject_id');

См. https://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html:

Соответствующие столбцы во внешнем ключе и ссылочном ключе должны иметь одинаковые типы данных,Размер и знак целочисленных типов должны быть одинаковыми.Длина типов строк не обязательно должна быть одинаковой.Для недвоичных (символьных) строковых столбцов набор символов и сопоставление должны быть одинаковыми.

0 голосов
/ 24 мая 2019

Проблема с вашими полями, определяющими порядок.Сначала вы должны добавить все свои поля, а затем добавить внешние ключи.

Попробуйте следующий код: -

public function up()
{
    Schema::create('students', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('first_name');
        $table->string('last_name');
        $table->string('student_code');
        $table->string('national_code');
        $table->integer('subject_id')->unsigned();
        $table->timestamps();

        $table->foreign('subject_id')
            ->references('id')->on('subjects');
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...