Mysql:如何根据年份和唯一编号创建自定义唯一密钥组合

Mysql:如何根据年份和唯一编号创建自定义唯一密钥组合,mysql,Mysql,好的,让我解释一下情况。我有一个“orders”表,表中有一个自动递增键“orderno”。该表还有一个字段“orderdate”。我想要的是一个格式化的订单号(orderno_formatted),格式为YYYYNUMBER,即订单日期加上一个唯一的编号。这里是扭转。如果2010年没有订单,“订单编号格式”应为20101,即订单年份1,然后是20102、20103等 明年的2011年,订单号应该是2011120112 那么,实现这一目标的最佳方式是什么呢。我知道,我可以在一列中搜索最大编号,但

好的,让我解释一下情况。我有一个“orders”表,表中有一个自动递增键“orderno”。该表还有一个字段“orderdate”。我想要的是一个格式化的订单号(orderno_formatted),格式为YYYYNUMBER,即订单日期加上一个唯一的编号。这里是扭转。如果2010年没有订单,“订单编号格式”应为20101,即订单年份1,然后是20102、20103等

明年的2011年,订单号应该是2011120112

那么,实现这一目标的最佳方式是什么呢。我知道,我可以在一列中搜索最大编号,但可能有很多用户正在访问该网站,因此如果一个用户获得最大编号并保存它,同时另一个用户可能会获得相同的编号

明白了吗

任何帮助都将不胜感激


关于,

如果您的唯一编号是32位长度,那么您可以在该值的末尾使用年位,例如,您有48位长度唯一值。

我建议您创建一个单独的序列表,其中包含字段
序列
。然后你要:

从年份序列中选择序列,其中年份=2010以进行更新

这将锁定表,以便同一行上的任何连续选择都将等待当前事务提交(如果启用了自动提交,请记住在运行SELECT…for UPDATE之前开始事务)

在此之后,将读取的序列号增加1,并使用以下命令将其推回:

UPDATE year\u sequence SET sequence=sequence+1,其中year=2010

或者,如果第一个查询没有读取任何行,您将插入一个序列为1的新行。然后使用
commit
提交更改

现在您得到了一个序列号,可以用来插入到另一个表中,该序列号保证在该年是唯一的,并且只要您记住在需要获取下一个序列号的任何位置使用此方法,就不会有冲突

另一种方法是启动一个事务,首先运行一个将序列值增加1的更新,并在更新后的同一个事务中读取新值,并且仅在更新后提交事务。这也确保了您读取的值始终是唯一的,因为其他事务将一直等到您读取新值之后