当前位置: 首页 > 知识库问答 >
问题:

SQLSTATE[HY000]:一般错误:1215无法添加外键约束Laravel

从经略
2023-03-14

我正在尝试使用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作为idit模型批次。我补充说:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Lot extends Model {
    protected $primaryKey = 'lot_id';

}

知道如何解决这个错误吗?

共有3个答案

阎功
2023-03-14

引用这个答案:

要查找特定的错误,请运行以下命令:

显示引擎INNODB状态

并查看最新外键错误部分。

这可能是类型的问题。comment_lot_id必须与lot_id完全相同。可能一个有符号,另一个无符号。

叶嘉颖
2023-03-14

看起来这不是你的问题,但我在Laravel 5.8中遇到了同样的错误,并发现了一个有趣的问题:Laravel现在将“id”列默认为“bigIncrements”,而不仅仅是“increments”。因此,与之前使用“integer”来引用它不同,您必须使用“biginger”来引用它。

如果父表如下所示:

$table->bigIncrements('id');

然后,儿童迁移需要如下所示:

$table->bigInteger('parent_id')->unsigned()->index();
$table->foreign('parent_id')->references('id')->on('parent');

希望这能帮助任何在5.8及以后遇到这个问题的人。

赵飞雨
2023-03-14

将以下规则应用到您的迁移文件:

[1]

父数据透视表必须基于支持外键引用的引擎(例如,用于mysql的InnoDB)。

Do$table-

我观察到laravel总是默认为MyISAM,因此这一行是必须的。

[2]

父项中引用的列必须是主键或唯一键。

父表中的这些声明很好:

$table-

$table-

[3]

透视表列的类型必须与其引用的父表列的类型相同。

例如,应该引用增量(“id”)的数据透视表列必须是unsignedInteger类型。

如果父表是char(20)类型,那么用于引用它的透视表列也必须是char(20)类型。

完成以上三个步骤后,根据需要定义外键关系。

 类似资料:
  • 我正在尝试使用Laravel 5.8为“users”表创建外键。 Laravel 5.8自动生成的迁移表如下, 然后从我的“存储库”表中,我引用了“用户”表,如下所示, 但我在这段代码上遇到了“一般错误:1215无法添加外键约束”错误。有许多与此问题相关的解决方案。 一般错误:1215无法在laravel中添加外键约束 迁移:无法在laravel中添加外键约束 MySQL数据库发生Laravel迁

  • 试图分配外键,但当你运行迁移,我得到这个这个错误,我不明白是什么问题。 SQLSTATE[HY000]:一般错误:1215无法添加外键约束(SQL:alter table

  • 问题内容: 我正在尝试为体育馆管理系统创建数据库,但无法弄清楚为什么会出现此错误。我试图在这里搜索答案,但找不到。 这是父表。 你们能帮我解决这个问题吗?谢谢。 问题答案: 为了将字段定义为,引用的父字段必须在其上定义了索引。 根据有关约束的文档: 参考parent_tbl_name(index_col_name,…) 定义上,和分别。并确保子列定义必须与其父列定义匹配。 更改表定义如下: 更改表

  • 问题内容: 我已经阅读了 Silberschatz的 数据库系统概念 ,第6版。我将在MySQL的OS X上实现第2章所示的大学数据库系统。但是我在创建表时遇到了麻烦。桌子看起来像 __ 创建表将导致以下错误。 在google搜索外键约束之后,我刚刚了解到“外键约束”一词表示来自表中外键列的数据必须存在于表的主键列中。但是我应该在插入数据时遇到此错误。 如果没有,为什么作者让我执行该SQL语句?

  • 关于这个错误,我到处都找过,也看过很多例子,但我还是想不出我的脚本有什么问题。如果这是一个常见的问题,我很抱歉,但到目前为止,搜索它对我没有帮助。剧本如下: 非常感谢你的帮助。