MySQL 特定情况下的计数器

MySQL counter for specific situations

我需要生成唯一的 "ids",问题是,它只能在 1 - 99999 之间。

"good" 事情是,它必须仅在与另一列的组中是唯一的。

我们有小组,每个小组都有自己的 "group_id",每个小组都需要 unique('group_id', 'increment_id')

99999 条记录现在对每个组来说足够几年了,但对所有组加在一起来说还不够,因此我不能只用 AUTO_INCREMENT 创建 table 并插入记录和取其自动增量。

例如,如果第一组需要 5 条记录,第二组需要 3 条记录,我想得到这样的结果:

group_id, increment_id
1, 1,
1, 2,
1, 3,
1, 4,
1, 5,
2, 1
2, 2,
2, 3

此外,冲突不是一个选项,因此如果以编程方式完成,使用 "length" 之类的东西可能会很棘手(即一次可以有 10 个请求,每个请求的第一个 select 长度对于给定的 group_id 然后尝试创建 10 行相同的 increment_id)

但是我在想 - 如果我将它设置为计数的 subselect 的值,那么它将永远是 "ok"?

您可以使用用户变量来获取每个 group_id:

中的递增数字
select 
    t.*, 
    @rn := if(@group_id = group_id,
                @rn + 1,
                if(@group_id := group_id, 1, 1)
            ) increment_id
from (
    select group_id
    from your_table t
    /* some where clauses */
    order by group_id
    ) t
cross join (
    select @rn := 0,
        @group_id := - 1
    ) t2

您可以创建一个辅助 table 命名计数器来管理:

table: 计数器 列:group_id、current_counter

每次插入一行 increment_id = select max(increment_id)+1 from table_xxx where group_id = group_xxxx