按组自动递增 mariaDB

问题描述 投票:0回答:1

我有这张 MariaDB 表。

id   order   name  forum_id
1      1     ....      1
2      2     ....      1
3      3     ....      1
4      1     ....      2
5      2     ....      2

其中id是PK.

order 是用户给定的数字来排列名字

name 是主题的名称

forum_id是另一个表的外键

在这个表中order和forum_id一起是唯一的。

UNIQUE('order', 'forum_id')
。这意味着您不能在 forum_id=1 中添加另一个 order=1。因为这种二元性已经存在。

现在我的问题是我如何使order 是根据forum_id 的自动增量字段?例如:当添加另一个forum_id=1 时,订单将获得4 的值。和另一个 forum_id=2 添加订单将获得编号 3。所以我的数据库看起来像这样

id   order   name  forum_id
1      1     ....      1
2      2     ....      1
3      3     ....      1
4      1     ....      2
5      2     ....      2
6      4     ....      1 
7      3     ....      2

我看到这个问题过去曾以不同的形式被问过。但大多数被问到的问题都来自 10-15 年前。所以我想也许这个问题在我使用 mariaDB 11 时得到了答案。

mysql sql mariadb auto-increment
1个回答
0
投票

AUTO_INCREMENT 必须完成两个任务:

  • 生成一个唯一的整数值,可用于高效快速地访问数据集。
  • 反映生成数据集的时间顺序(没有指定时间)。

AUTO_INCREMENT 不应该用于其他逻辑结构,特别是那些假设 auto_increment 值代表一系列连续编号的值。

使用带有 auto_increment 的复合索引有两个严重的缺点:查询复合索引较慢,并且记录的时间顺序不再可用。

为了避免冗余,ORDER 应该是一个计算列并且不存储在数据库中。 正如 Ahmed 的评论中已经建议的那样,应该使用窗口函数。由于auto_increment的值是唯一的,所以使用RANK、DENSE_RANK还是ROW_NUMBER都没有关系

SELECT id, RANK() OVER (PARTITION BY forum_id ORDER BY id) AS `order`,
       name, forum_id FROM yourtable
© www.soinside.com 2019 - 2024. All rights reserved.