我正在考虑像这样格式化它
TYYYYMMDDNNNNNNNNNNX (1个字符+19个数字)
哪里
问题是,如何生成顺序号码?因为我的主键不是自动增量整数值,如果它是我会使用它,但它不是。
EDIT我可以在1天(24小时)后自动重置序列号。
(X是校验位)
答案 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>另请注意,可能没有真正的理由将事务编号实际存储在数据库中,因为很容易从它编码的信息中获取它。您需要存储的只是序号。