Laravel 抛出 errno:150 “外键约束的格式不正确”,尽管语法正确
Posted
技术标签:
【中文标题】Laravel 抛出 errno:150 “外键约束的格式不正确”,尽管语法正确【英文标题】:Laravel throws errno: 150 "Foreign key constraint is incorrectly formed" despite the correct syntax 【发布时间】:2020-08-12 03:45:06 【问题描述】:我正在尝试添加一个包含两个外键的表,见下文:
Schema::create('semester_cohorts', function (Blueprint $table)
$table->bigIncrements('id');
$table->unsignedBigInteger('semester_id');
$table->unsignedBigInteger('cohort_id');
$table->timestamps();
$table->foreign('semester_id')
->references('semesters')
->on('id')
->onDelete('cascade');
$table->foreign('cohort_id')
->references('id')
->on('cohorts')
->onDelete('cascade');
);
我收到以下消息:PDOException::("SQLSTATE[HY000]: General error: 1005 Can't create table [table name](errno: 150 "Foreign key constraint is incorrectly formed")")
,尽管数据库中存在相应的引用表,但名称中没有拼写错误,并且主键/外键的类型匹配。什么可能导致这个问题?
`
【问题讨论】:
【参考方案1】:您的第一个外键中混淆了references
和on
:
$table->foreign('semester_id')
->references('semesters')
->on('id')
->onDelete('cascade');
应该是
$table->foreign('semester_id')
->references('id')
->on('semesters')
->onDelete('cascade');
【讨论】:
【参考方案2】:这里可能有一些问题:
检查两个表的列类型,类型应该相同尝试拆分迁移。首先创建表 semester_cohorts 然后在下面使用
Schema::table('semester_cohorts', function (Blueprint $table)
$table->foreign('semester_id')
->references('id')
->on('semesters')
->onDelete('cascade');
$table->foreign('cohort_id')
->references('id')
->on('cohorts')
->onDelete('cascade');
);
【讨论】:
【参考方案3】:我实际上遇到了这个问题,这是因为unsignedBigInteger
类型。
外键列必须与其引用的主键具有相同的数据类型。
因此,如果您在semesters
和cohorts
表中的主键 是bigIncrements
类型的
您应该将外键类型定义为BigInteger
,然后在其后面加上unsigned()
:
$table->bigIncrements('id');
$table->bigInteger('semester_id')->unsigned();
$table->bigInteger('cohort_id')->unsigned();
$table->timestamps();
编辑:
就像kerbholz说你在定义外键时有一个错误
【讨论】:
这两个表中的主键都是 unsignedBigInteger(或者,确切地说是返回 unsignedBigInteger 的 bigIncrements)以上是关于Laravel 抛出 errno:150 “外键约束的格式不正确”,尽管语法正确的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 迁移:“外键约束格式不正确”(errno 150)
laravel 8 (errno: 150 "外键约束格式不正确")