2017-02-22 57 views
0

我需要生成独特的“IDS” MySQL的计数器,美中不足的是,它可以是只有1间 - 99999针对具体情况

“好”的事情是,它必须是唯一的独特组与另一列。

我们有两组,每组都有自己的“GROUP_ID”,每组需要像unique('group_id', 'increment_id')

的99999条记录是不够好几年了每个组的权利,但它是不够的,所有的组一起,所以我不能只用AUTO_INCREMENT创建表并在其中插入记录并进行自动增量。

例如,如果我需要5个记录一组和三个记录了两个组,我想获得这样的事:

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

此外,冲突是不是一种选择,因此使用类似“长度”可以是棘手的,如果做编程(可以有也就是10个请求一次,对于给定的GROUP_ID他们每个人的第一选择长度,然后尝试创建10行具有相同increment_id)

但是我在想 - 如果我将它设置为count的子选项的值,比它总是“OK”?

回答

1

您可以创建一个附配表命名计数器来管理:

表:柜台 列:GROUP_ID,current_counter

OR

每次插入一行increment_id =选择MAX(increment_id)+1从TA ble_xxx其中group_id = group_xxxx

+0

第一个选项本身不起作用 - 每当我在那里放置记录时它就会上升,因此会更早达到99999 – libik

+0

然而第二个选项 - 碰撞是什么?如果大量的并发请求到达数据库来创建这样的记录,它会一直是“ok”,还是会崩溃,因为在试图放入新记录时,在给定时间选择“max”不再是最大值了? – libik

+0

你只需要更新current_counter为特定的group_id,每个组将有你想要的分隔计数器。 –

1

您可以使用用户变量每个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