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 constraint user_roles_role_id_foreign foreign key (role_id) references roles () 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 迁移外键错误的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5 与外键相关的迁移错误

Laravel 迁移错误号:150“外键约束格式不正确”

无法添加外键约束 - Laravel 迁移错误

Laravel 数据库迁移外键错误

Laravel 迁移 - 一般错误:1215 无法添加外键约束

laravel 5.4 迁移错误:150“外键约束格式不正确”