【问题标题】:Not able to add foreign key constraint to pivot table无法将外键约束添加到数据透视表
【发布时间】:2018-03-06 08:46:41
【问题描述】:

我正在尝试使用外键创建一个数据透视表,这是我在 Laravel 中所做的迁移:

public function up()
{
    Schema::create('player_position', function (Blueprint $table) {
        $table->integer('player_id')->unsigned()->index();
        $table->integer('position_id')->unsigned()->index();

        $table->foreign('player_id')->references('id')->on('players')->onDelete('cascade');
        $table->foreign('position_id')->references('id')->on('positions')->onDelete('cascade');
    });
}

但是,我得到一个错误:

[照亮\数据库\查询异常]
SQLSTATE[HY000]:一般错误:1215 无法添加外键约束 (SQL:alter tableplayer_position添加约束 player_position_posi tion_id_foreign 外键 (position_id) 在删除级联时引用positions (id)

                                                                         [PDOException]                                                        

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

我读过通常外键约束错误是关于没有为字段分配无符号,或者数据库中已经有记录,但是我的数据库是空的,我的字段有无符号,所以不知道是什么问题?

【问题讨论】:

  • 我建议你不要在你的数据库上使用约束。相反,请尝试在您的代码中对其进行管理。
  • @MortezaRajabi 为什么会这样?
  • 管理这样一个带有约束的表很难,每次你想添加或删除一些东西时都会遇到这些错误。
  • 这不是一个好习惯。

标签: mysql database laravel laravel-migrations


【解决方案1】:

删除 ->index() 方法,因为它创建基本索引,而您要添加引用另一个表上的主键的外键约束。

 $table->integer('player_id')->unsigned();
 $table->integer('position_id')->unsigned();

 $table->foreign('player_id')->references('id')->on('players')->onDelete('cascade');
 $table->foreign('position_id')->references('id')->on('positions')->onDelete('cascade');

【讨论】:

    【解决方案2】:

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

    对于要定义为foreign key 的字段,所引用的父字段必须在其上定义index。并且列的数据类型及其大小必须相同。

    我认为您违反了上述某些规则。

    【讨论】:

    • 但是,它们确实定义了索引
    • 那么datatype呢?
    • 同样,它们都是整数
    • 它们的整数类型和长度是否相同?例如,无符号和 11 个字符都长。
    • 我遇到了这个问题。将父 id 列从 $table->bigIncrements 更改为 $table->increments(以匹配数据透视表上的 $table->integer)对我有用。
    猜你喜欢
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 2017-07-16
    • 2013-03-10
    相关资源
    最近更新 更多