如何生成交易号?

时间:2010-12-09 15:45:49

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

我正在考虑像这样格式化它

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

哪里

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

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

EDIT我可以在1天(24小时)后自动重置序列号。

  • P201012080000000001X< - 首先 2010/12/08交易
  • P2010120810000000002X< ---秒 2010/12/08交易
  • P201012090000000001X< ---首先 2010/12/09交易

(X是校验位)

5 个答案:

答案 0 :(得分:1)

没有背景,这个问题就毫无意义。其他人评论了你的问题。请回答评论。什么是“交易号”;在哪里使用;什么是“事务”,你需要一个外部标识符。

身份或自动增量列可能在内部有一些用处,但它们在数据库之外是无用的。

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

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

答案 1 :(得分:0)

您可以单独跟踪自动注册表。

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

或添加auto-inc字段,但不要将其用作密钥。

答案 2 :(得分:0)

您可以使用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生成器。

答案 3 :(得分:0)

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

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

关于良好的主键选择标准,请阅读此内容。 http://www.sqlskills.com/BLOGS/KIMBERLY/category/Indexes.aspx

答案 4 :(得分:0)

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

您可以考虑以下选项:

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

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

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

    < / LI>

另请注意,可能没有真正的理由将事务编号实际存储在数据库中,因为很容易从它编码的信息中获取它。您需要存储的只是序号。