【问题标题】:In SQL Server, how do I set the next value for an autoincrement field to an arbitrary value like you can in Postgres?在 SQL Server 中,如何像在 Postgres 中一样将自动增量字段的下一个值设置为任意值?
【发布时间】:2011-12-26 10:28:32
【问题描述】:

是否可以像在 Postgres 中那样在 SQL Server 中设置 autoincrement 字段的下一个值?

对于好奇的人,这是整个背景故事。我的公司曾经使用 Postgres,它允许您轻松地将自动增量字段的下一个值设置为任意值。

新公司收购了旧公司,现在我们正在将 Postgres 数据导入 SQL Server。不知何故,帐户上的自动递增 AcctID 字段设置为 9 位数字,即使有数千个 8 位数字。显然有人出于某种现在未知的原因在 Postgres 中这样做了一段时间。

所以现在在新的 SQL Server 数据库中,新账户都有 9 位的账户 ID,但是客户的会计软件无法处理 9 位的账户号码,所以他们添加的任何新账户都无法处理他们的会计部门,直到问题得到解决。

当然,有多达 72 个不同的表可以依赖于 AccountsAcctID 字段,并且客户在意识到所涉及的问题之前创建了大约 360 个新帐户,因此保存这些数据,截断表,并且重新插入数据将是一项繁重的任务。

最好将 AcctID 的自动增量值设置为最后 8 位值 + 1。然后至少他们可以在解决 9 位帐户的解决方案时添加新帐户在。事实上,他们声称他们只需要他们添加的 360 帐户中的 3 个。

那么是否可以像在 Postgres 中那样在 SQL Server 中重置字段的自动增量值?

【问题讨论】:

    标签: sql-server postgresql auto-increment


    【解决方案1】:

    在 SQL Server 中,您可以像这样重置自动增量列:

    dbcc checkident ( table_name, RESEED, new_value )
    

    你可以查看 MSDN 的文档here

    【讨论】:

    • 但是对于此列,身份规范为否,并且没有身份增量或身份种子。 CheckIdent 在这种情况下还能正常工作吗?
    • 不,不会。 AFAIK 通过标识列在 MSSQL is 中声明自动增量列的唯一方法。如果它的标识规范为否,它是如何自动递增的?我有点疑惑。我们说的是微软的 SQL Server,对吧?
    • 我敢说这是在 SQL Server 之外的触发器或其他机制中管理的。我可以特别想到两种以这种方式工作的产品,一种通过触发器,另一种通过分配下一个数字的外部管理服务器。两者都基于应用特定的下一个数字表。如果它不是身份列,您能否详细说明可能导致此问题的任何触发器或外部服务依赖项?如果是商业产品,它是什么?
    • 啊哈,我找到了。帐户 ID 在 Account 表中不是唯一的,但它们在帐户类型表中是唯一的,例如 MemberAccounts 或 MeetingAccounts。每种账户类型都有自己的索引,这些表中的索引就是身份。因此,当创建一个新的 MemberAccount 时,它的 AcctID 会自动递增,然后将该 ID 插入到 Accounts 表中。所以 CheckIdent 可以工作,但只能在帐户类型表上工作,而不是在主帐户表上。
    【解决方案2】:

    你也可以这样做:

    CREATE TABLE #myTable
        (
          ID INT IDENTITY,
          abc VARCHAR(20)
        )
    
    INSERT  INTO #myTable
            SELECT  'abc'
            UNION ALL
            SELECT  'abc'
            UNION ALL
            SELECT  'abc'
            UNION ALL
            SELECT  'abc'
            UNION ALL
            SELECT  'abc'
            UNION ALL
            SELECT  'abc'
            UNION ALL
            SELECT  'abc'
            UNION ALL
            SELECT  'abc'
            UNION ALL
            SELECT  'cba'
    
    SELECT  *
    FROM    #myTable 
    
    -- Jump Identities
    SET IDENTITY_INSERT #myTable  ON
    INSERT  INTO #myTable
            ( id, abc )
    VALUES  ( 50, 'cbd' )
    
    SELECT  *
    FROM    #myTable 
    SET IDENTITY_INSERT #myTable  OFF
    
    -- Back to contigious
    INSERT  INTO #myTable
            SELECT  'abc'
            UNION ALL
            SELECT  'abc'
            UNION ALL
            SELECT  'abc'
            UNION ALL
            SELECT  'abc'
            UNION ALL
            SELECT  'abc'
            UNION ALL
            SELECT  'abc'
            UNION ALL
            SELECT  'abc'
            UNION ALL
            SELECT  'abc'
            UNION ALL
            SELECT  'cba'
    
    SELECT  *
    FROM    #myTable 
    DROP TABLE #myTable 
    

    【讨论】:

    • 是的,但这也需要一个标识列(对吗?),mutatron 说它没有。
    • 这是在没有触发器的情况下自动递增的唯一方法。如果它是基于触发器的,那么他应该没有任何限制来插入他想要的任何东西。
    猜你喜欢
    • 2013-04-21
    • 2012-07-13
    • 1970-01-01
    • 2016-06-23
    • 2016-09-04
    • 2013-01-01
    • 2017-04-05
    • 1970-01-01
    • 2012-12-22
    相关资源
    最近更新 更多