当我尝试使用迁移在laravel 5中设置外键约束时,我收到错误:
[Illuminate \ Database \ QueryException] SQLSTATE [HY000]:常规 错误:1215 无法添加外键约束(SQL:alter table
rittenregistratie
添加co nstraint rittenregistratie_karakterrit_id_foreign外键 (karakterrit_id
)在删除时引用karakterrit
(id
) cascade)[PDOException] SQLSTATE [HY000]:常规错误:1215 无法添加外键约束D:\ wamp \ www>
但我现在知道为什么???迁移的顺序是正确的,为什么我会收到此错误?表rittenregistratie有一个名为karakterrit_id的外键,这是表karakterrit中的主键。
这是我的移民rittenregistratie:
public function up()
{
Schema::create('rittenregistratie', function (Blueprint $table)
{
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->timestamps('datum');
$table->integer('beginstand');
$table->integer('eindstand');
$table->text('van');
$table->text('naar');
$table->text('bezoekadres');
$table->text('geredenroute');
$table->integer('karakterrit_id')->default(1);
$table->text('toelichting');
$table->integer('kilometerszakelijk');
$table->integer('kilomteresprive');
$table->foreign('user_id')
->references('id')
->on('users')
->onDelete('cascade');
$table->foreign('karakterrit_id')
->references('id')
->on('karakterrit')
->onDelete('cascade');
});
}
答案 0 :(得分:5)
添加
$table->integer('karakterrit_id')->unsigned()->default(1);
您是否创建了在查询中使用的users
表和karakterrit
。如果您同时拥有这两个表,请检查迁移文件的创建日期,然后在引用它们的其他表之前创建它们。
另一个问题可能是MyISAM
不支持。而是使用InnoDB
DB::statement('ALTER TABLE categories ENGINE = InnoDB');
答案 1 :(得分:1)
在大多数情况下,被引用的列必须是主键或具有我发现的唯一键
答案 2 :(得分:0)
Laravel 8的一个常见问题是,在其上创建了foreign_id的表是早先创建的。因此,在运行迁移时,它们按顺序运行,并且找不到外部ID引用的表。如果您看到这种情况,则会将第二张表的名称更改为较早的日期,并进行排序。
所以说将2020_12_04_081855_create_developers_table.php重命名为2020_12_03_081855_create_developers_table.php。
那会解决的。请记住,日期应该早于第一个表格。