MariaDB-发票编号-每年返回0

时间:2019-01-29 20:22:10

标签: php mysql sql mariadb

你好

我想提出建议,因为我开发了一个生成报价和发票(在PHP / MariaDB中)的CRM。

什么是生成发票号码(以便有没有在数据库中的冲突 - 永不重复的号码等)的最佳方式?

PS: 我希望每年的每个年初(1月1日)都将发票号重新设置为零。 和CRM将由几个商店中使用,我要为每个商店的单独的编号。

起初,我认为我应该在订单表( order_invoices )中放置一个 number 列(int)。和在PHP创建一个新的发票时做这样的(例如具有锋德Laravel):

$lastNumber = OrderInvoice::whereRaw(
        'number = (
            SELECT MAX(number) FROM order_invoices
        )'
    )
    ->first()
    ->number;

$orderInvoice = new OrderInvoice();
$orderInvoice->number = $lastNumber + 1;
// other... assigne values to others columns
$orderInvoice->save();

但反射后,我不知道这是最好的解决办法(我用的事务,以便高流量的CRM和几名成员在同一时间验证命令冲突的风险计费号码的增量?)。

我认识的一位开发人员曾建议我创建一个 counters 表。并且在该表中:

_add为列:的 ID 下,的(该列将被递增以知道我们在编号)

_在此表中,为每个商店放置一行(行)。

_And在我的程序(我的控制器的动作),用于建立一个新的发票:

_在发票生成之初锁定行(在商店行);

_To检索的计数器表,并且这个值将其插入(具有1)插入的的发票表格( order_invoices );

您怎么看?和你有什么其他的想法和建议吗?

非常感谢您。

2 个答案:

答案 0 :(得分:2)

仅架构:

数据库成员:

  • main_id自动递增主键
  • index_of_year
  • 唯一键(年,index_of_year)

进度:

  • 插入带有年份的元素,将index_of_year设置为NULL
  • 获取最后插入的ID作为CUR_ID
  • 将记录的index_of_year更新为max + 1

答案 1 :(得分:0)

使用MariaDB-10.3 Sequence

获取next invoice number

NEXT VALUE FOR invoice_number

创建年度活动:

CREATE EVENT reset_invoice_number
ON SCHEDULE EVERY 1 YEAR
DO 
ALTER SEQUENCE invoice_number RESTART 0