微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Laravel 迁移连接表 FK 索引中是否存在错误?

如何解决Laravel 迁移连接表 FK 索引中是否存在错误?

我正在使用:

  • Laravel 框架 8.21.0
  • 10.4.14-MariaDB

对于任意两个表之间的联结表,以上面为例(表usersroles之间),联结表是在没有外键索引的情况下创建的。

public function up()
{
    Schema::create('user_role',function (Blueprint $table) {
        $table->unsignedBigInteger('user_id');
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

        $table->unsignedBigInteger('role_id');
        $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');

        $table->unique(['user_id','role_id']);
    });
}

创建的索引是:

  • user_role_user_id_role_id_unique
  • user_role_role_id_foreign

缺少预期的 user_role_user_id_foreign

查询 information_schema获取索引:

SELECT i.name AS `Index`,GROUP_CONCAT(f.name ORDER BY f.pos) AS `Columns`
FROM information_schema.innodb_sys_tables t 
JOIN information_schema.innodb_sys_indexes i USING (table_id) 
JOIN information_schema.innodb_sys_fields f USING (index_id)
WHERE t.name = '******/user_role'
GROUP BY 1

我得到了这个结果:

索引
user_role_role_id_foreign role_id
user_role_user_id_role_id_unique user_id,role_id

这种行为在所有其他联结表中都是一致的:

  • user_permission,
  • role_permission,
  • 等等...

如果我使用 unique 而不是 primary,索引将是:

  • PRIMARY
  • user_role_role_id_foreign

如果我既不使用 primary 也不使用 unique,则会创建两个外键索引:

  • user_role_role_id_foreign
  • user_role_user_id_foreign

但是这种“修复”是不可接受的。

发现用于图表的行为逆向工程没有“找到”这些关系。

现在,问题:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。