Laravel 迁移外键错误
Posted
技术标签:
【中文标题】Laravel 迁移外键错误【英文标题】:Laravel Migration Foreignkey Error 【发布时间】:2019-01-31 07:28:17 【问题描述】:Laravel 5.6 运行于: php 7.2, MariaDB 10.3
当我想为我的表设置外键时,我一直在犯这个错误。
在其他表上,所有由 Laravel 自己定义的 id 变量并自动递增无符号
所以,我的迁移是这样的:
public function up()
Schema::create('user_roles', function (Blueprint $table)
$table->increments('id');
$table->unsignedInteger('role_id');
$table->unsignedInteger('user_id');
$table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
);
错误是这样的:
SQLSTATE[42000]: 语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,了解在 lin 的 ') on delete cascade' 附近使用的正确语法 e 1 (SQL: alter table
user_roles
add constraintuser_roles_role_id_foreign
foreign key (role_id
) referencesroles
() on delete cascade)
Laravel 抛出的错误:
1 PDOException::("SQLSTATE[42000]: 语法错误或访问冲突:1064 您的 SQL 语法有错误;请查看与您的 MariaDB 服务器版本相对应的手册,了解在 ') 附近使用的正确语法删除第 1 行的级联") C:\xampp\htdocs\order-project\vendor\laravel\framework\src\Illuminate\Database\Connection.php:452
2 PDO::prepare("修改表
user_roles
添加约束user_roles_role_id_foreign
外键(role_id
)在删除级联时引用roles
()") C:\xampp\htdocs\order-project\vendor\laravel\framework\src\Illuminate\Database\Connection.php:452
【问题讨论】:
其他表/迁移可以正常运行吗?所以设置没有问题? 试试:$table->Integer('role_id')->unsigned()
似乎 Laravel 出于某种原因忽略了->references('id')
。没有级联,它可以工作吗?
@utdev 是的,所有其他迁移都运行没有任何错误。 @AlvaroAlves,我已经尝试过了,它给出了类似“ PDOException::("SQLSTATE[HY000]: General error: 1005 Can't create table order-project
.#sql-3228_8a
(errno: 150 "Foreign key constraint is格式不正确“)”)“@Phiter不,它也不起作用。顺便说一句,Php Storm 说“在 Illuminate\Support\Fluent 中找不到方法'引用'”,但我认为这是关于 IDE 而不是关于 laravel,因为当我使用 VSC 时没有这样的错误。跨度>
您可以在***.com/questions/31263637/… 之后进行测试,这会将您的迁移查询作为原始 sql 查询返回。只是为了确保查询是正确的
【参考方案1】:
试试这个
$table->integer('role_id')->unsigned();
$table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
【讨论】:
它对我不起作用,我收到如下错误:一般错误:1005 无法创建表order-project
.#sql-410_a
(errno:150 "外键约束格式不正确" )")【参考方案2】:
我认为你对这个帖子有类似的问题Laravel foreign key onDelete('cascade') not working
希望对你有帮助
【讨论】:
谢谢,但它也不起作用。错误是:errno: 150 "外键约束格式不正确") 您是否按照问题中的建议将引擎更改为 InnoDB?【参考方案3】:我解决了这个问题。它失败是因为 Laravel 试图在角色表之前迁移 user_roles 表。我只是在 user_roles 表之前迁移角色表,它就成功了!在解决方案规则表没有抛出错误但尚未完全创建之前。
【讨论】:
以上是关于Laravel 迁移外键错误的主要内容,如果未能解决你的问题,请参考以下文章