【问题标题】:Unique document number for the month当月的唯一文件编号
【发布时间】:2011-01-17 18:02:12
【问题描述】:

我需要按以下格式创建发票编号:

CONSTANT_STRING/%d/mm/yyyy

mm - 月份(两位数) yyyy - 年

现在,%d 是特定月份的发票编号。换句话说,这个数字每个月都会重置一次。

现在我正在检查数据库中当月的最高数字是多少。然后在其递增之后,我将保存该行。

我需要整个数字是唯一的。但是,有时会发生复制(两个用户同时保存)。

有什么建议吗?

【问题讨论】:

  • 那张桌子上有 unique_identifier 吗?你不能用那个吗?或者也许是一个时间戳来确定哪个条目首先出现?
  • 您的表使用的是哪个数据库引擎?

标签: php mysql invoice


【解决方案1】:

在字段上放置一个唯一索引,并在尝试保存第二个实例时捕获数据库错误。此外,将获取值推迟到最后可能的时刻。

【讨论】:

    【解决方案2】:

    一种解决方案是SELECT ... FOR UPDATE,它会阻塞行直到您更新它,但可能会导致 serios 多任务应用程序死锁。

    最好的方法是获取数字并在事务中增加它,然后开始工作。 这样,该行就不会被长时间锁定。

    查看BEGIN WORKCOMMIT

    【讨论】:

      【解决方案3】:

      使用发票表的主键(最好是INT)或为每张发票分配一个唯一编号,例如通过uniqid

      附言。如果您使用uniqid,您可以通过将more_entropy 参数设置为true 来增加唯一性

      【讨论】:

        【解决方案4】:

        在一个查询中设置 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').'\'))';
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-12-16
          • 1970-01-01
          • 2014-01-28
          • 2011-05-21
          • 1970-01-01
          相关资源
          最近更新 更多