我需要按以下格式创建发票编号:
CONSTANT_STRING/%d/mm/yyyy
mm - 月(两位数) yyyy - 年
现在,%d是特定月份的发票编号。换句话说,这个数字每个月都会重置。
现在我在数据库中检查当月的最高数字是多少。然后在它的增量之后我保存该行。
我需要整个数字是唯一的。但是,有时会发生复制(两个用户同时保存)。
有什么建议么?
在字段上放置一个唯一索引并在尝试保存第二个实例时捕获数据库错误。此外,将获取值推迟到最后可能的时刻。
一种解决方案是SELECT ... FOR UPDATE
,它会阻塞行直到您更新它,但可能会导致 serios 多任务应用程序死锁。
最好的方法是获取数字并在事务中增加它,然后开始工作。这样,该行不会长时间锁定。
查看BEGIN WORK
和COMMIT
。
使用发票表的主键(最好是INT
)或为每张发票分配一个唯一编号,例如通过uniqid
。
PS。如果您正在使用,您可以通过将参数设置为uniqid
来增加唯一性。more_entropy
true
在一个查询中设置所有 ID。
$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').'\'))';