无法将外键约束添加到数据透视表
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 table
player_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无法勾选“将此数据添加到数据模型?