我试图在Laravel中创建外键,但是当我使用工匠迁移表时,抛出了以下错误:
λ php artisan migrate
Migration table created successfully.
[Illuminate\Database\QueryException]
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `fees` add constraint `fee
s_fee_type_id_foreign` foreign key (`fee_type_id`) references `feetypes` (`fee_type_id`))
[PDOException]
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint
我的迁移代码如下:
费用
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateFeesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('fees', function (Blueprint $table) {
$table->increments('fee_id');
$table->integer('academic_id')->unsigned();
$table->integer('level_id')->unsigned();
$table->integer('fee_type_id');
$table->string('fee_heading', 100)->nullable();
$table->float('amount', 8, 2);
$table->foreign('academic_id')->references('academic_id')->on('academics');
$table->foreign('level_id')->references('level_id')->on('levels');
$table->foreign('fee_type_id')->references('fee_type_id')->on('feetypes');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('fees');
}
}
fesstypes
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateFeetypesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('feetypes', function (Blueprint $table) {
$table->unsignedinteger('fee_type_id');
$table->string('fee_type', 100);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('feetypes');
}
}
关于我做错了什么的任何想法,我想立即得到,因为我有很多表需要创建,例如用户,学生,Leves等。理想情况下,我想创建使用外键(即费用和费用类型)保存此数据的表。
希望有人可以帮助我入门。
答案 0 :(得分:0)
替换此行:
$table->integer('fee_type_id');
与此:
$table->unsignedInteger('fee_type_id');
在CreateFeesTable
迁移中。
答案 1 :(得分:0)
检查所有数据类型是否与引用的数据类型匹配。
public function up()
{
Schema::create('fees', function (Blueprint $table) {
$table->increments('fee_id');
$table->unsignedInteger('academic_id');
$table->unsignedInteger('level_id');
$table->unsignedInteger('fee_type_id');
$table->string('fee_heading', 100)->nullable();
$table->float('amount', 8, 2);
$table->foreign('academic_id')->references('academic_id')->on('academics');
$table->foreign('level_id')->references('level_id')->on('levels');
$table->foreign('fee_type_id')->references('fee_type_id')->on('feetypes');
});
}
检查级别中的level_id,学者中的Academic_id,费用类型中的fee_type_id也是 unsignedInteger 或 autoincrement ,并将您的表创建脚本更改为上面的脚本。
答案 2 :(得分:0)
CreateFeesTable.php
更改
$table->integer('fee_type_id');
到
$table->unsignedInteger('fee_type_id');
CreateFeetypesTable
更改
$table->unsignedinteger('fee_type_id');
到
$table->increments('fee_type_id');
或
$table->integer('fee_type_id');
答案 3 :(得分:0)
您必须首先在所引用的列(即fee_type_id
表中的feetypes
上创建索引。
MySQL要求在外键和引用键上建立索引,以便外键检查可以快速进行,而无需进行表扫描。在引用表中,必须有一个索引,其中外键列以相同的顺序列为第一列。如果这样的索引不存在,则会在引用表上自动创建。如果您创建另一个可用于强制外键约束的索引,则以后可能会静默删除该索引。如果给定,则使用index_name(如前所述)。