【发布时间】:2017-07-15 09:59:39
【问题描述】:
昨天,两个不同的人问了我同样的问题。他们的表有一个将记录组合在一起的字段,例如年份或位置。在这些组中,他们希望拥有一个从 1 开始并按顺序递增的唯一 ID。显然,您可以搜索MAX(ID),但如果这些应用程序有大量流量,它们需要锁定整个表以确保不会多次返回相同的 ID。我考虑过使用序列,但这意味着为每个组动态创建一个序列。
示例 1:
在这一年中创建的记录应加一,然后在明年年初从 1 重新开始。
| Year | ID |
|------|----|
| 2016 | 1 |
| 2016 | 2 |
| 2017 | 1 |
| 2017 | 2 |
| 2017 | 3 |
示例 2:
一家公司有许多地点,他们希望为每个客户生成一个唯一的 ID,将地点 ID 与递增的 ID 结合起来。
| Site | ID |
|------|----|
| XYZ | 1 |
| ABC | 1 |
| XYZ | 2 |
| XYZ | 3 |
| DEF | 1 |
| ABC | 2 |
【问题讨论】:
-
你的问题是什么?
-
从数据的角度来看,这听起来是个非常糟糕的主意。当一行被删除时会发生什么?您是否需要重新编号所有内容或空白是否正常?在某些点重新启动的自动编号组是有时会出现的事情之一,它几乎总是其他地方设计不佳的标志。
-
是否有直接的方法来生成这些 ID?我想确保该解决方案在高流量环境中运行良好。是否有一些开箱即用的东西,或者它是否足够奇怪以至于需要手工制作。
-
@SeanLange 我猜它应该像一个标识列,即使删除了一条记录,它也会无限增加。
-
除非您需要这些值来持久化,否则为什么不直接使用 ROW_NUMBER?按站点分区,TheYearColumn,按 SomeColumn 排序
标签: sql-server grouping auto-increment identity