Я проектирую систему, в которой у меня есть несколько магазинов, где каждый магазин должен иметь свой собственный набор последовательных номеров для своих счетов-фактур. Очевидно, что мой основной идентификационный столбец будет последовательным для всех счетов-фактур в системе, поэтому, очевидно, мне понадобится еще один столбец для хранения этого номера магазина «конкретный магазин». Каков наилучший способ хранения и получения следующего идентификатора для данного номера магазина? Например, было бы безопасно просто получить это прямо из таблицы счетов-фактур, сделав что-то вроде: SELECT MAX(INV_NUM) FROM INVOICES WHERE SHOP_ID = #
и добавить его, а затем создать новую запись счета-фактуры? Или возникнут проблемы с синхронизацией, если два экземпляра моего сценария должны были запускаться одновременно? Например, первый скрипт извлекает следующий идентификатор, но прежде чем он получит возможность создать новую запись счета, второй экземпляр запрашивает следующий идентификатор и получает тот же самый, что и первый скрипт ... Я тогда думал о том, чтобы просто сохранить последнее использовать номер в отдельной таблице, и как только я запрошу следующий номер счета, немедленно напишите новый номер следующего заказа и сохраните его, чтобы время между получением следующего номера заказа и созданием записи, на которую будет рассчитываться следующий запрос, будет абсолютный минимум ... буквально три строки кода:Вторая колонка с порядковыми номерами в базе данных
$nextId = $shop->getLastId() + 1;
$shop->setLastId($nextId);
$em->persist();
счетов-фактур
------------------------------
| ID | INV_NUM | SHOP_ID |
------------------------------
| 1 | 99 | 1 |
| 2 | 100 | 2 |
| 3 | 100 | 1 |
Магазины
-------------------
| ID | LAST_ID |
-------------------
| 1 | 100 |
| 2 | 100 |
Вот один из вариантов, если вы используете MyISAM: http://stackoverflow.com/questions/677542/auto-increment-by-group –
Обычно для этого используется триггер. –
@GordonLinoff Но как он мог использовать триггер на одной таблице? –