首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于特定情况的MySQL计数器

用于特定情况的MySQL计数器
EN

Stack Overflow用户
提问于 2017-02-22 18:47:51
回答 2查看 34关注 0票数 0

我需要生成唯一的“is”,捕获的是,它只能在1- 99999之间。

“好”之处在于,它只能在与另一列组成的组中才是唯一的。

我们有组,每个组都有自己的"group_id“,每个组都需要类似于unique('group_id', 'increment_id')的东西。

现在99999条记录对于每个组来说已经足够了几年,但是对于所有的组来说还不够,所以我不能仅仅用AUTO_INCREMENT创建表,插入记录并自动递增。

例如,如果第一组需要5条记录,第二组需要3条记录,那么我应该得到如下内容:

代码语言:javascript
复制
group_id, increment_id
1, 1,
1, 2,
1, 3,
1, 4,
1, 5,
2, 1
2, 2,
2, 3

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

但是我在想--如果我把它设置为计数的子选择的值,它就会永远是"ok“吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-22 18:54:02

您可以创建一个名为计数器的auxiliar表来管理该表:

表:计数器列: group_id、current_counter

每次插入一行时,increment_id =从table_xxx中选择max(increment_id)+1,其中group_id = group_xxxx

票数 1
EN

Stack Overflow用户

发布于 2017-02-22 18:52:48

您可以使用用户变量来获取每个group_id中的递增号:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42399816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档