【问题标题】:SQL restart number sequence each yearSQL 每年重启的编号顺序
【发布时间】:2019-02-07 00:39:43
【问题描述】:

我正在努力创建一个简单的修复日志序列号。我想为每次维修创建一个唯一代码,但我不希望数字永远持续下去,我想使用区域(部门)、年份和编号来识别每次维修。我正在使用 SQL Server 17。 我知道我可以将这些字段连接在一起以创建数字,但我不确定如何在年初重置数字?

(图片帮助描述)

谢谢!

【问题讨论】:

  • 简单的身份有什么问题?任何类型的滚动您自己的重新编号都具有挑战性并且存在并发问题。
  • IMO,RepairNumber 应该用零填充到比您预期一年内需要的多一位数。以 A190001 为例。这允许自然排序。我将根据插入时调用的函数在 RepairNumber 列上使用默认值。添加一个唯一的约束,你应该被设置。
  • 函数默认设置的列示例:stackoverflow.com/questions/442503/…

标签: sql sql-server


【解决方案1】:

如果您希望表中的每一行都有一个唯一编号,请使用identity 主键。它不会在每年重置。它可能有间隙——比如当一行被删除时。但这是实现您想要的最有效的方式。

如果您尝试在输入上创建自己的值,那么本质上您必须在计算下一个数字时锁定整个表。这会锁定其他更新并插入到表中,因此这是一项昂贵的操作。如果您不这样做,您将受到竞争条件的影响,两个不同的线程可能被分配相同的编号。

标识列可能不美观,但它确实是识别表中行的最佳解决方案。

【讨论】:

    【解决方案2】:

    假设您不想允许平局,请像这样使用Row_Number

    Select *, Row_Number() over (partition by Year order by [date?])
    From MyTable
    

    [date?] 替换为您必须在年内发出订单信号的任何标识符。

    partition by year 告诉它在每个新年从 1 重新开始编号。

    【讨论】:

      【解决方案3】:

      这会生成随机排序的“维修编号”

      SELECT 
        zone, 
        year, 
        row_number() OVER (PARTITION BY year ORDER BY (SELECT 1)) AS [Repair Number]
      FROM t
      

      串联:

      SELECT
        zone,
        year,
        [Repair Number],
        zone + CAST(year AS VARCHAR) + CAST([Repair Number] AS VARCHAR) AS [Concatenated]
      FROM (
        SELECT 
          zone, 
          year, 
          row_number() OVER (PARTITION BY year ORDER BY (SELECT 1)) AS [Repair Number]
        FROM t
      ) t
      

      当然,您可能不应该分配随机数,而是确定性地分配它们,例如基于 ID / 身份等,因此将 ORDER BY (SELECT 1) 替换为更有意义的内容。

      【讨论】:

        【解决方案4】:

        如果您使用身份值,您可以将种子身份重置为您想要的任何值:

        DBCC CHECKIDENT ('TableName', RESEED, 5000)
        

        请记住,身份并不能保证唯一值 - 只是比以前使用的值大一个。上述代码将下一个标识重置为 5001。

        如果您使用的是序列,则可以使用

        更改序列

        ALTER SEQUENCE dbo.Seq1 RESTART WITH 5000;

        【讨论】:

        • 这里的问题是这不是一个很好的解决方案,因为它不是动态的。当您需要在上一年添加一行时会发生什么?你必须摆弄你的身份或序列,并希望在你这样做的时候没有其他人插入。此外,当您需要使用新值时,您每年都必须对其进行调整。
        • 如果您是在前一年添加的,则为 true。在我漫长的职业生涯中,这种情况发生在我身上的次数恰好为零。通常,您要为当前所在的年份添加行。为什么最终太阳会熄灭,然后年份将不计算在内,因为我们将不得不搬到另一个星球。
        • 对,但即使您不必将数据添加到旧年份,您仍然必须每年手动摆弄这个。
        猜你喜欢
        • 2021-07-08
        • 1970-01-01
        • 1970-01-01
        • 2012-06-11
        • 1970-01-01
        • 2022-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多