【问题标题】:Start identity in an existing table / column from a particular number从特定数字开始现有表/列中的标识
【发布时间】:2021-07-19 13:22:04
【问题描述】:

我有一个包含数千条记录的现有表,其中包含主键、外键和关系。我必须将主键列设置为标识,但我不想从 0 开始,因为表已有记录,我也不想丢失数据。

我必须保存确切的表格设计。

我必须添加一个身份,重新设置它。 我该怎么办?

谢谢!

【问题讨论】:

标签: sql sql-server-2012 ssms


【解决方案1】:

您无法将身份添加到现有表。身份必须指定为表创建的一部分。你有两个选择。

  1. 重新创建具有正确设置标识的新表,并设置 IDENTITY_INSERT ON 并将现有行插入新表和 IDENTITY_INSERT OFF。
CREATE TABLE [dbo].[NewTable](
    [ID] [int] IDENTITY(1000,1) NOT NULL PRIMARY KEY, -- 1000 is Reseed value
    Col1
    Col2
);

-- SET IDENTITY_INSERT to ON.  
SET IDENTITY_INSERT dbo.NewTable ON;  
GO  
INSERT INTO NewTable(Id,col1,col2...)
SELECT Id, col1, col2... FROM oldtable;
GO
SET IDENTITY_INSERT dbo.NewTable OFF;  
GO 
  1. 创建一个以起始值作为种子值的序列,并将该序列用于将来的插入。
CREATE SEQUENCE dbo.TestSeq
    START WITH 1000 -- Reseed value  
    INCREMENT BY 1 ;  
GO 

INSERT Test.TestTable (ID, Col1, Col2,...)  
    VALUES (NEXT VALUE FOR dbo.TestSeq, 1, 2,...) ;  
GO 

【讨论】:

    【解决方案2】:

    我找到了解决办法:

    1. 在 SSMS -> 工具 -> 选项 -> 设计器中:从“防止保存需要重新创建表的更改”中删除 V。
    2. 在设计模式下打开表格,并将 V 添加到 Identity Spcification 属性中。

    这也会自动重新播种。

    【讨论】:

      【解决方案3】:

      只需使用 ID 更新表。然后选择当前最大 ID 执行

      DBCC CHECKIDENT ('MyTable', RESEED, maxId)  
      

      More about reseeding

      【讨论】:

      • 谢谢。但是这个列现在不是一个身份,只是一个主键。这会很好用吗?
      • @utor 您需要删除表并缓存其数据,使用所需值重新创建它,然后使用缓存数据填充。
      猜你喜欢
      • 2023-02-21
      • 2019-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      • 2017-11-13
      相关资源
      最近更新 更多