这是我的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))
答案 0 :(得分:1)
因此,您的subjects
表id
具有BIG INT
数据类型,subject_id
应该具有相同的数据类型。
改为使用$table->unsignedBigInteger('subject_id');
。
外键列必须具有相同的数据类型+相同的长度+ 与相应参考列的比例相同
答案 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');
});
}