【问题标题】:How to generate a transaction number?如何生成交易号?
【发布时间】:2011-05-22 22:55:23
【问题描述】:

我正在考虑这样格式化它

TYYYYMMDDNNNNNNNNNNX (1 个字符 + 19 位数字)

在哪里

  • T 是类型
  • YYYY是年份
  • MM 是月份
  • DD是一天
  • N 是序号
  • X 是校验位

问题是,如何生成序号?因为我的主键不是一个自动递增的整数值,如果是我会使用它,但它不是。

编辑我可以让序列号在 1 天(24 小时)后自行重置。

  • P201012080000000001X
  • P2010120810000000002X
  • P201012090000000001X

(X为校验位)

【问题讨论】:

  • 你能用一个文件吗?只需获取数字,然后将其递增并保存?
  • 您的并发要求是什么,是否有其他限制(例如,序列号中没有间隙?)?
  • 您可以简单地存储分解的字符串的每个元素,这将需要另外 6 个 db 字段(必须是主键),但这会简化生成字符串的过程,因为您可以检查如果今天有订单并相应地设置序号。然后处理这 6 个字段以构建输出字符串。
  • 你能添加架构吗?例如,您是否已经提交了类型和日期?
  • 你想在哪里完成这个?这个问题的标签留下了相当广泛的可能性......你能描述一下完整的解决方案吗?

标签: c# php asp.net sql-server


【解决方案1】:

没有上下文,这个问题毫无意义。其他人对您的问题发表了评论。请回答cmets。什么是“交易号”;它在哪里使用;您需要外部标识符的“交易”是什么。

标识或自增列可能在内部有一些用处,但在数据库之外它们就没什么用了。

如果我们有完整的架构,知道哪些组件是不会改变的 PK 等,我们可以提供更有意义的答案。

乍一看,没有要求的信息,我认为在“交易”中记录日期没有意义(日期已经存储在交易行中)

【讨论】:

    【解决方案2】:

    您似乎有交易编号的公式,您真正遇到的唯一问题是如何生成每天重置的序列号。

    您可以考虑以下选项:

    • 使用数据库序列和重置它的计划作业。

    • 使用数据库外部的序列(例如,文件或内存结构)。

    • 使用适当的隔离级别,您应该能够在 INSERT 语句中包含 (SELECT (MAX(Seq) + 1) FROM Table WHERE DateCol = CURRENT_DATE) 作为值表达式。

    另请注意,可能没有真正的理由将交易号实际存储在数据库中,因为很容易从它编码的信息中推导出它。您只需要存储序列号即可。

    【讨论】:

      【解决方案3】:

      您可以单独跟踪 auto-incs。

      或者,当您准备添加新事务时。首先轮询数据库以获取最新事务并将其分解以找到数字,然后增加该数字。

      或者添加一个 auto-inc 字段,但不要将其用作键。

      【讨论】:

        【解决方案4】:

        您可以使用 uuid 生成器,这样您就不必担心序列,并且确保事务之间不会发生冲突。

        例如:

        在java中:

        java.util.UUID.randomUUID()

        05f4c168-083a-4107-84ef-10346fad6f58
        5fb202f1-5d2a-4d59-bbeb-5bcabd513520
        31836df6-d4ee-457b-a47a-d491d5960530
        3aaaa3c2-c1a0-4978-9ca8-be1c7a0798cf
        

        在 php 中:

        echo uniqid()

        4d00fe31232b6
        4d00fe4eeefc2
        4d00fe575c262
        

        几乎所有语言都有 UUID 生成器。

        【讨论】:

        • GUID 是一个非常糟糕的主键选择。请阅读我上面引用的帖子。
        • java.util.UUID.randomUUID() 是否有 C# 中可用的等效项
        • 在 C# 中有等价物可用于生成 GUID
        【解决方案5】:

        这么大的主键是一个非常非常糟糕的主意。您将不必要地浪费大量的表空间,并使您的表的查询和管理速度非常慢。使您的主键成为一个小的简单递增 int 并将交易日期存储在单独的字段中。在查询中如有必要,您可以选择当天的交易编号:

        SELECT ROW_NUMBER OVER (PARTITION BY TxnDate ORDER BY TxnID), TxnDate, ...
        

        请阅读本文以了解良好的主键选择标准。 http://www.sqlskills.com/BLOGS/KIMBERLY/category/Indexes.aspx

        【讨论】:

        • 它没有用作主键!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-28
        • 1970-01-01
        • 2016-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-09
        相关资源
        最近更新 更多