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 (将#修改为@)