Уникальный номер документа за месяц - PullRequest
1 голос
/ 17 января 2011

Мне нужно создать номер счета в формате:

CONSTANT_STRING/%d/mm/yyyy

мм - Месяц (две цифры) гггг - Год

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

Сейчас я проверяю в базе данных, какое самое высокое число в текущем месяце.Затем после его увеличения я сохраняю строку.

Мне нужно, чтобы все число было уникальным.Однако иногда случается, что он дублируется (два пользователя сохраняются одновременно).

Есть предложения?

Ответы [ 4 ]

2 голосов
/ 17 января 2011

Поместите уникальный индекс в поле и поймайте ошибку базы данных при попытке сохранить второй экземпляр.Кроме того, отложите получение значения до последнего возможного момента.

1 голос
/ 17 января 2011

Одним из решений является SELECT ... FOR UPDATE, которое блокирует строку до тех пор, пока вы не обновите ее, но может вызвать взаимоблокировки с многозадачным приложением serios.

Лучший способ - извлечь число и увеличить его в транзакции изатем начните работу.Таким образом, строка не блокируется долго.

Просмотрите BEGIN WORK и COMMIT.

0 голосов
/ 17 января 2011

установить все идентификаторы в одном запросе.

$query = 'INSERT INTO table (invoice_number) VALUES (CONCAT(\''.CONSTANT.'\', \'/\', (SELECT COUNT(*) + 1 AS current_id FROM table WHERE MONTH(entry_date) = \''.date('n').'\' AND YEAR(entry_date) = \''.date('Y').'\'), \'/\', \''.date('m/Y').'\'))';
0 голосов
/ 17 января 2011

Используйте первичный ключ (предпочтительно INT) таблицы счетов или присвойте уникальный номер каждому счету, например, через uniqid.

PS. Если вы используете uniqid, вы можете увеличить уникальность , установив для параметра more_entropy значение true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...