无法将外键约束添加到数据透视表

Posted

技术标签:

【中文标题】无法将外键约束添加到数据透视表【英文标题】: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 为什么会这样? 管理这样一个带有约束的表很难,每次你想添加或删除一些东西时都会遇到这些错误。 这不是一个好习惯。 【参考方案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)对我有用。

以上是关于无法将外键约束添加到数据透视表的主要内容,如果未能解决你的问题,请参考以下文章

使用 Visual Studio 数据库项目中的数据将外键约束添加到现有表

为啥在创建数据透视表时,Excel2013无法勾选“将此数据添加到数据模型?

MySQL 无法添加外键约束

使用dapper扩展的外键和数据透视表

Laravel Eloquent 用于数据透视表,一个表有 2 个外键,另一个表有 1 个外键

如何根据数据透视表中两列(两个外键)中的 ID 返回相关模型?