2010-12-09 64 views
2

我想格式化这样如何生成交易号码?

TYYYYMMDDNNNNNNNNNNX (1个字符+ 19位)

  • 牛逼类型为
  • YYYY是一年
  • MM是月
  • DD是一天
  • ň是序贯数
  • X是校验位

的问题是,我怎么产生了顺数?因为我的主键不是一个自动递增整数值,如果是我会使用它,但它不是。

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

  • P201012080000000001X < - 第一 2010/12/08
  • P2010120810000000002X <的交易--- 2010/12/08
  • P201012090000000001X <的第二 交易--- 2010年第一 交易/ 12/09

(X位是校验位)

+0

你可以使用一个文件吗?只需得到号码然后增加并保存它? – SwDevMan81 2010-12-09 15:50:05

+1

您的并发需求是什么?是否还有其他限制(例如序列号中没有间隔?)? – 2010-12-09 15:50:12

+0

你可以简单地存储你的字符串爆炸的每个元素,它会需要6个以上的分区字段(这将是主键),但这会缓解生成字符串的过程,因为您可以检查今天是否有订单,顺序设置序列号。然后处理这6个字段以构建输出字符串。 – 2010-12-09 16:41:35

回答

0

你似乎对你的交易号公式,你真正唯一的问题是如何生成一个重置每一天的序列号。

您可以考虑以下选项:

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

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

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

另外请注意,可能没有真正的理由实际上是交易号存储在数据库中,因为它很容易从它编码的信息得到它。所有你需要存储的是序列号。

0

您可以分别跟踪汽车配件。

或者,您准备添加新的交易。首先轮询最新交易的数据库,并分开寻找数字,并增加数字。

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

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生成器。

0

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

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

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

1

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

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

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

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