外键laravel迁移

时间:2019-05-24 11:25:26

标签: laravel database-migration

这是我的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 个答案:

答案 0 :(得分:1)

因此,您的subjectsid具有BIG INT数据类型,subject_id应该具有相同的数据类型。

改为使用$table->unsignedBigInteger('subject_id');

Reference

  

外键列必须具有相同的数据类型+相同的长度+   与相应参考列的比例相同

答案 1 :(得分:1)

好像您的问题在subject_id定义中。 在我们的例子中,本地和外键必须为相同类型:

$table->unsignedBigInteger('subject_id');

请参见https://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html

  

外键和引用键中的对应列必须具有相似的数据类型。整数类型的大小和符号必须相同。字符串类型的长度不必相同。对于非二进制(字符)字符串列,字符集和排序规则必须相同。

答案 2 :(得分:0)

问题在于您的字段定义顺序。您必须先添加所有字段,然后再添加外键。

尝试以下代码:-

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');
    });
}