Задать вопрос
@Nolan81
программист

Как лучше формировать уникальный номер в БД, помимо автоинкрементного ключа?

Есть БД типа:
группа
id name code ...
1  1b2    111

студент
id group_id name contract_number
1  1   Иванов  ?


и вот нам при создании студента нужно формировать ему уникальный номер договора contract_number.
при этом в номере договора такие части присутствуют:
- может быть какой нибудь префикс, даже не число, поэтому числовые операции отпадают
- должен быть code от группы
- дату можно в виде 090621

Как бы лучше такое организовать, чтобы уникальные номера договоров получались.
В течении дня вести суффикс, типа
111090621001
111090621002
как то не сильно интересно выискивать все такие номера у которых внутри
contract_number like '__090621%'
, это ж в php придется все перебирать, не в Mysql.

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

Может есть какие еще удачные подходы к решению такой задачи?

p.s. Плюс еще нет гарантий что вот эта часть до даты будет строго определенное кол-во цифр, туда могут потребовать какую то id-шку вставить, т.е. даже вот этот like не будет работать, а менять на % не совсем, я думаю, математически верно.
  • Вопрос задан
  • 192 просмотра
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 3
usdglander
@usdglander
Yipee-ki-yay
Вы же в курсе что уникальный индекс можно повесить на набор полей, а не на одно поле? Держите все эти поля в разных столбцах таблицы, а для контроля целостности объединяете их в один уникальный индекс.
Ответ написан
Комментировать
@Dmtm
Android
не надо смешивать техническую информацию с прикладной
уникальный ключ - техническая, уникальный номер договора - прикладная,
короче, естественные ключи - зло, абстрактные - добро,
если заказчик непременно хочет что-то запихнуть в номер договора
(причем гарантированно через год он захочет еще)
то
1) хранить это что-то как отдельные поля для поиска
2) ни в коем случае не использовать номер договора для связей
3) номер не хранить а собирать запросом только для вывода (если запретить редактирование исходных полей)
4) уникальность номеру договора добавит timestamp
Ответ написан
Комментировать
@ComodoHacker
Сделайте контракт отдельной сущностью и храните в отдельной таблице. В один прекрасный день у вас неизбежно появятся студенты с несколькими контрактами.

Для выбора уникального номера зафиксируйте полный префикс и ищите максимальный номер с этим префиксом
contract_number like '111090621%'
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы