Генерация уникальной записи, Нестандарный auto_increment

sublimity

Новичок
Генерация уникальной записи, Нестандарный auto_increment

PHP+MYSQL:
Возник вопрос, в решении которого, я надеюсь, вы мне поможете.
Есть уникальный индентификатор товара. Он состоит из 10-ти символов.
Первые 5 символов будут получаться по определенному правилу. Причем для товаров, принадлежащих одной группе, эти символы будут одинаковыми. Оставшиеся 5 символов (именно символов, т.е. это и буквы и\или числа) должны быть сгенерированы. Эти символы должны быть уникальными.

Есть таблица с :
ID: bigint(20) unsigned NOT NULL auto_increment
IDText: char(20) NOT NULL
Type: tinyint(4) default '0',
Где:
IDText- это то самое поле,
Type- показывает свободна эта запись(0) или используется (1),или (3)-забронированна; т.к. индентификатор товара" может освобождаться и должен быть использован после.

Пример : допустим есть:
MOSAU1111A - занят
MOSAU1111B - свободен
MOSAU1111C - занят
....
MOSAU111ZZ - занят

И надо далее сгенерировать при добавлении "товара": MOSAU11A00
Или найти MOSAU1111B ,т.е. найти свободные или создать новые...

Причем это возможно и паралельно , т.е. надо исключить при генерации возможность создания на два товара одинаковых номеров.


Что вы посоветуете по реализации данной задачи?
Моя идея:
блокировать таблицу на чтение (чтобы параллельно не выполнялось то же самое), получить которые свободны и установить флаг в занято и освободить таблицу, и если таких не найдено получать все, которые есть (а там их может быть очень много), и пытаться на стороне PHP придумать следующий.
 

Steamroller

Новичок
Что вы посоветуете по реализации данной задачи?
Моя идея:
блокировать таблицу на чтение (чтобы параллельно не выполнялось то же самое), получить которые свободны и установить флаг в занято и освободить таблицу, и если таких не найдено получать все, которые есть (а там их может быть очень много), и пытаться на стороне PHP придумать следующий.
Ну что-то в этом духе, да.
Надо только вот для этих генерируемых пятерок символов держать отдельный столбец.
И индекс составной по полям (Type, IDText)
Когда тебе надо создать новый номер, то делаешь так:
лочишь таблицу на запись (а не на чтение).
select idtext2 from table where type=0 order by idtext2 asc limit 1;
получаешь свободный идентификатор с наименьшим номером

Если таких нету -
select idtext2 from table order by idtext2 desc limit 1;
получаешь максимальный номер, дальше в PHP к нему уже единичку добавляешь.
 

Фанат

oncle terrible
Команда форума
Эти символы должны быть уникальными.
индентификатор товара" может освобождаться и должен быть использован после.
да уж.
уникальность на грани фантастики.

-~{}~ 03.10.05 20:26:

а примитивная идея использовать мускулевский автоинкремент так никому в голову и не пришла
 

Steamroller

Новичок
а примитивная идея использовать мускулевский автоинкремент так никому в голову и не пришла
Идея-то на поверхности лежит. Но в mysql нету механизма использования "освободившихся" значений автоинкремента. Так что автоинкремент не поможет.
 

Фанат

oncle terrible
Команда форума
вот именно, что нету.
потому, что в mysql идентификатор действительно уникальный.
 

Z3X

Новичок
Может это и не рационально, но я бы предложил использовать еще одну таблицу для только что сгенерированных идентификаторов и при генерации новых проверять и ее, + каждые 10 минут например проводить очистку.
 

Seo

Guest
Автор оригинала: Z3X
Может это и не рационально, но я бы предложил использовать еще одну таблицу для только что сгенерированных идентификаторов и при генерации новых проверять и ее, + каждые 10 минут например проводить очистку.
Запросов много будет. А значит, при количестве пользователей более 1000 в сутки, будет сильно загружен сервер, что есть очень плохо :(
 
Сверху