2017-02-22 7 views
0

Мне нужно создать уникальный «иды», улов, он может быть только между 1 - 99999.MySQL счетчик для конкретных ситуаций

«Хорошее» Дело в том, что он должен быть уникальным только в группе с другой колонкой.

У нас есть группы, каждая группа имеет свой собственный «GROUP_ID», и каждая группа должна что-то вроде unique('group_id', 'increment_id')

The 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, чем всегда будет «хорошо»?

ответ

1

Вы можете создать таблицу ДОПОЛНИТЕЛЬНОЙ именованные счетчики для управления, что:

стола: счетчики колонны: GROUP_ID, current_counter

ИЛИ

Каждый раз, когда вы вставить строку increment_id = выбрать максимум (increment_id) +-из тех ble_xxx, где group_id = group_xxxx

+0

Первый вариант не работает сам по себе - он поднимался каждый раз, когда я ставил запись там, поэтому дошел до 99999 намного раньше – libik

+0

Однако второй вариант - как насчет столкновений? Если для создания таких записей в базу данных приходит много параллельных запросов, всегда ли это «нормально», или может произойти сбой, потому что выбор «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 
Смежные вопросы