我试图使用artisan
创建一个外键,但这个错误出现了。
[Illuminate\Database\QueryException]
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `comments` add constraint `comments_comment_lot_id_foreign` foreign key (`comment_lot_id`) references `lots` (`lot_id`
) on delete cascade)
这是我的迁移:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateCommentsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('comments', function (Blueprint $table) {
$table->increments('id');
$table->text('comment');
$table->integer('comment_lot_id')->unsigned();
$table->timestamps();
});
Schema::table('comments', function ($table) {
$table->foreign('comment_lot_id')->references('lot_id')->on('lots')->onDelete('cascade');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropForeign(['comment_lot_id']);
Schema::dropIfExists('comments');
}
}
在批次表我使用lot_id
作为id
它模型Lot.php我添加:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Lot extends Model {
protected $primaryKey = 'lot_id';
}
知道如何解决这个错误?
将以下规则应用于迁移文件:
[1]
父,数据透视表必须基于支持外键引用的引擎(例如InnoDB for mysql)。
在其他列定义之前,在迁移文件中执行$table->engine = “InnoDB”;
。
我观察laravel始终默认为MyISAM,因此这条线是必须的。
[2]
父级中引用的列必须是主键或唯一键。
父表中的这些声明很好:
qazxsw poi表示列“id”是可引用的
qazxsw poi表示列“column_name”是可引用的
[3]
数据透视表列的类型必须与其引用的父表列的类型相同。
因此,例如,应引用增量(“id”)的数据透视表列必须是unsignedInteger类型。
如果父表是char(20)类型,那么用于引用它的数据透视表列也必须是char(20)类型。
完成上述所有三项操作后,请根据需要定义外键关系。
看起来这对你来说不是问题,但我在Laravel 5.8中遇到了同样的错误并发现了一个有趣的问题:Laravel现在将'id'列默认为'bigIncrements'而不仅仅是'增量'。因此,不必像以前那样使用'整数'来引用它,而是必须使用'bigInteger'来引用它。
如果您的父表看起来像这样:
$table->increments(“id”);
然后子迁移需要如下所示:
$table->column_type(“column_name”)->unique();
希望这有助于其他人在5.8及更高版本中遇到此问题。
引用$table->bigIncrements('id');
要查找特定错误,请执行以下操作:
$table->bigInteger('parent_id')->unsigned()->index(); $table->foreign('parent_id')->references('id')->on('parent');
并查看this answer:部分。
这可能是类型的问题。 SHOW ENGINE INNODB STATUS;
必须与LATEST FOREIGN KEY ERROR
完全相同。也许一个是签名而另一个是未签名的。