- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好的,让我解释一下场景。我有一个“订单”表,其中有一个自动增量键“orderno”。该表也有一个字段“orderdate”。我想要的是格式化的订单号。 (orderno_formatted) 采用以下样式 YYYYNUMBER,即订单日期加上唯一编号。这是一个转折点。如果没有 2010 年的订单,“orderno_formatted”应为 20101,即订单年份和 1,然后是 20102、20103 等。
明年 2011 年,(orderno_formatted) 应该像 20111、20112
那么实现这一目标的最佳方法是什么。我知道,我可以搜索最大编号。在一个列中,但可能有许多用户正在访问该站点,因此如果一个获得最大编号并保存它,同时另一个用户可能会获得相同的编号。
清楚了吗?
我们将不胜感激。
问候,
最佳答案
我建议您创建一个单独的序列表,其中包含字段 year
和 sequence
。然后你做:
SELECT sequence FROM year_sequence WHERE year = 2010 FOR UPDATE
这会锁定表,以便同一行上的任何连续选择都将等待当前事务提交(如果启用了自动提交,请记住在运行 SELECT ... FOR UPDATE 之前开始事务)。
在此之后,您将读取的序列号递增 1,然后将其推回:
更新 year_sequence SET sequence = sequence + 1 WHERE year = 2010
或者,如果第一个查询没有读取任何行,您将插入一个序列为 1 的新行。然后您使用 COMMIT
提交更改。
现在你得到了一个序列号,你可以用它来插入到另一个表中,它保证在那一年是唯一的,并且只要你记得在任何你需要获取下一个的地方使用这个方法就不会发生冲突序号。
另一种方法是启动一个事务,首先运行一个更新,将序列值递增 1,并在更新后的同一事务中读取新值,并且仅在此之后提交事务。这也确保您读取的值始终是唯一的,因为其他事务将等到您读取新值之后。
关于MySQL : how to create custom unique key combination based on year and a unique no,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4545981/
我是一名优秀的程序员,十分优秀!