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

标签 php mysql sql mariadb

你好,

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

生成发票编号的最佳方法是什么(以便数据库中永远不会发生冲突 - 永远不会重复编号等)?

附言: 我希望每年年初(1 月 1 日)重新开始将发票编号归零。 并且 CRM 将被多个商店使用,我想为每个商店单独编号。

起初,我想我应该在我的订单表 (order_invoices) 中放置一个 number 列 (int)。在 PHP 中创建新发票时这样做(Eloquent de 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();

但经过反射(reflection),我不确定这是最好的解决方案(我在 CRM 上使用如此高流量的事务,并且多个成员同时验证一个命令......在账单编号递增中存在冲突的风险?)。

例如,我认识的一位开发人员建议我创建一个计数器 表。在这张表中:

_添加为列:idnumber(此列将递增以了解我们在编号中的位置)。

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

_在我的程序中(我的 Controller 的操作),用于创建新发票:

_在发票生成开始时锁定一行(在商店行);

_从counters 表中检索number,并将此值插入(带+1)到invoice 表的number (order_invoices);

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

非常感谢。

最佳答案

仅模式:

数据库成员:

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

进度:

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

关于php - MariaDB - 发票编号 - 每年返回0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54429026/

相关文章:

PHP:通过现有的 SSH 连接进行 SSH

php - Laravel 5 | DatabaseSeeder.php 中的多个 Seeder

javascript - 简单的php闹钟如何不断检查是否到达时间

php - 如何在php中访问嵌套数组

php - 获取等于或大于并为空的记录

sql - Oracle - 两个表中两行之间的差异或变化

javascript - 禁用提交,但首先提交表单

php - 从 MYSQL 点转换为 Swift CLLocationCoordinate2D

mysql - SQL索引优化WHERE查询

sql - 在 postgres 中使用 select inside alter table 语句的结果