2017-02-22 47 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