我正在尝试使用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';
}
知道如何解决此错误?
答案 0 :(得分:22)
将以下规则应用于您的迁移文件:
<强> [1] 强>
父级,数据透视表必须基于支持的引擎 外键引用(例如InnoDB for mysql)。
$table->engine = “InnoDB”;
在您的迁移文件中,就在其他列定义之前。
我观察laravel始终默认为MyISAM,因此这条线是必须的。
<强> [2] 强>
父级中引用的列必须是主要列或唯一列 键(一个或多个)。
父表中的这些声明很好:
$table->increments(“id”);
表示列“id”是可引用的
$table->column_type(“column_name”)->unique();
表示列“column_name”是可引用的
<强> [3] 强>
数据透视表列的类型必须与其相同 引用父表列。
因此,例如,应引用增量(“id”)的数据透视表列必须是unsignedInteger类型。
如果父表是char(20)类型,那么用于引用它的数据透视表列也必须是char(20)类型。
完成上述所有三项操作后,请根据需要定义您的外键关系。
答案 1 :(得分:3)
要查找特定错误,请执行以下操作:
SHOW ENGINE INNODB STATUS;
查看
LATEST FOREIGN KEY ERROR
部分。
这可能是类型的问题。 comment_lot_id
必须与lot_id
完全相同。也许一个是签名而另一个是未签名的。
答案 2 :(得分:3)
看起来这不是您的问题,但是我在Laravel 5.8中遇到了相同的错误,并发现了一个有趣的问题:Laravel现在将'id'列默认为'bigIncrements'而不是'increments'。因此,您不必像以前那样用'integer'来引用它,而必须用'bigInteger'来引用它。
如果您的父表如下所示:
$table->bigInteger('parent_id')->unsigned()->index();
$table->foreign('parent_id')->references('id')->on('parent');
然后,子迁移需要如下所示:
{{1}}
希望这可以帮助其他人在5.8及更高版本中遇到此问题。