mysql 按组mariaDB自动递增

1szpjjfi  于 2023-03-17  发布在  Mysql
关注(0)|答案(1)|浏览(139)

我有张MariaDB的table。

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

其中id为主键。

order是用户给定的编号,用于排列名称
name是这个主题的名称

forum_id是另一个表的外键
在此表中,order和forum_id是唯一。UNIQUE('order', 'forum_id')。这意味着您不能将另一个order=1添加到其中forum_id=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的时候得到了答案。

0x6upsns

0x6upsns1#

AUTO_INCREMENT必须恰好完成2项任务:

  • 生成可用于高效快速访问数据集的唯一整数值。
  • 反映生成数据集的时间顺序(无时间说明)。

AUTO_INCREMENT不应用于其它逻辑构造,尤其是那些假定auto_increment值 表示一系列连续编号的值。
使用带有auto_increment的复合索引有两个严重的缺点:查询合成索引较慢并且记录的时间顺序不再可用。
为了避免冗余,ORDER应该是一个计算列,并且不存储在数据库中。正如Ahmed的注解中所建议的,应该使用一个窗口函数。 是唯一的,则使用RANK、DENSE_RANK还是ROW_NUMBER都无关紧要。

SELECT id, RANK() OVER (PARTITION BY forum_id ORDER BY id) AS `order`,
       name, forum_id FROM yourtable

相关问题