好的,让我解释一下这个场景。我有一个“订单”表,其中包含一个auto incr键“orderno”。该表还有一个字段“orderdate”。我想要的是格式化的订单号。 (orderno_formatted)以下格式YYYYNUMBER即订单日期加上唯一编号。这是扭曲。如果2010年没有订单,“orderno_formatted”应该是20101,即订单年份1和2010年,2010年等等。
明年2011年,(orderno_formatted)应该像20111年,20112年
那么实现这一目标的最佳途径是什么?我知道,我可以搜索最大号码。在一列中,但有可能,许多用户正在访问该网站,所以如果获得最大值并保存,同时另一个用户可能会得到相同的数字。
清楚?
任何帮助将不胜感激。
此致
答案 0 :(得分:2)
我建议您使用字段year
和sequence
创建单独的序列表。然后你做:
SELECT sequence FROM year_sequence WHERE year = 2010 FOR UPDATE
这将锁定表,以便同一行上的任何连续选择将等待当前事务提交(记住在运行SELECT之前开始事务...如果启用了自动提交,则为FOR UPDATE。)
在此之后,您将读取的序列号增加1,然后将其推回:
UPDATE year_sequence SET sequence = sequence + 1 WHERE year = 2010
或者,如果第一个查询没有读取任何行,您将插入序列为1的新行。然后使用COMMIT
提交更改。
现在你有了一个可以用来插入另一个表的序列号,保证在那一年是唯一的,只要你记得在任何你需要的地方使用这个方法就不会有冲突序号。
另一种方法是启动事务,并首先运行UPDATE,将序列值递增1,并在更新后的同一事务中读取新值,并且仅在提交事务之后。这也确保您读取的值始终是唯一的,因为其他事务将等到您读取新值之后。
答案 1 :(得分:0)
如果您的唯一编号是32位长度,那么您可以使用年份位,例如在此值的末尾,那么您具有48位长度的唯一值。