我有这张 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 时得到了答案。
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