用常规序列替换MSSQL自动增量标识

问题描述 投票:0回答:1

对我来说,MSSQL Server的自动增量标识列无法按我的预期工作是我的突然麻烦。

不保证顺序一致。我的意思是,如果重新启动服务器时像1, 2, 3, 4, 5一样,可以像10006, 10007, 10008, 10009, 10010一样轻松继续。如果您使用这些编号生成了一些文档(比如说合同),则可能导致您的公司签订了编号为1, 2, 3, 4, 5的合同,然后意外更改为10006, 10007, 10008, 10009, 10010

在其他RDBM上,自动增量列始终保持一致性,并且无论是否重新启动它都没关系。

所以现在我想更改要由序列提供服务的列。问题是如何才能最大程度地平滑?我使用实体框架及其迁移机制。

该列定义为:

CREATE TABLE [dbo].[
    -- omitted for the sake of brevity
    [CompanyNo] [bigint] IDENTITY(1,1) NOT NULL
    -- omitted for the sake of brevity
);

我最好的猜测是创建迁移:

  1. 获取列CompanyNo的当前最新值
  2. 修改列以使其不自动递增
  3. 创建序列的起始值为步骤1的起始值

技术:

  • 实体框架6 +迁移+代码优先
  • MSSQL
  • ASP.NET MVC
sql-server entity-framework sequence ef-migrations auto-increment
1个回答
1
投票

我的建议是在表中添加一个时间戳列,该列在逻辑上记录何时添加给定记录。然后,当您想生成序列时,可以使用ROW_NUMBER快速执行:

SELECT *, ROW_NUMBER() OVER (ORDER BY ts_col) seq
FROM yourTable;

如果您需要有保证的有序序列,则不应依赖于自动递增列,因为它不是用于此目的的。自动递增列的合同规定,生成的值将始终是唯一的且通常会增加,但不一定是连续的顺序。

© www.soinside.com 2019 - 2024. All rights reserved.