从特定数字开始在现有 table / 列中标识
Start identity in an existing table / column from a particular number
我现有 table 有数千条记录,有主键、外键和关系。我必须将主键列设置为identity,但我不想从0开始,因为table有现有记录,我也不想丢失数据。
我必须保存准确的 table 设计。
我必须添加一个身份,和重新设置它。
我该怎么办?
谢谢!
只需更新 table ID。然后选择当前最大ID执行
DBCC CHECKIDENT ('MyTable', RESEED, maxId)
我找到了解决方案:
- 在 SSMS -> 工具 -> 选项 -> 设计器中:删除 'Prevent Saving changes that require table re-creation' 中的 V。
- 在设计模式中打开 table,并将 V 添加到 Identity Specification 属性。
这也会自动重新播种。
您无法将身份添加到现有 table。必须将身份指定为 table 创建的一部分。你有两个选择。
- 重新创建新的 table 并正确设置身份并重新设置种子值并设置 IDENTITY_INSERT ON 并将现有行插入新的 table & 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
- 创建一个以起始值作为补种值的序列,并将该序列用于您以后的插入。
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
我现有 table 有数千条记录,有主键、外键和关系。我必须将主键列设置为identity,但我不想从0开始,因为table有现有记录,我也不想丢失数据。
我必须保存准确的 table 设计。
我必须添加一个身份,和重新设置它。 我该怎么办?
谢谢!
只需更新 table ID。然后选择当前最大ID执行
DBCC CHECKIDENT ('MyTable', RESEED, maxId)
我找到了解决方案:
- 在 SSMS -> 工具 -> 选项 -> 设计器中:删除 'Prevent Saving changes that require table re-creation' 中的 V。
- 在设计模式中打开 table,并将 V 添加到 Identity Specification 属性。
这也会自动重新播种。
您无法将身份添加到现有 table。必须将身份指定为 table 创建的一部分。你有两个选择。
- 重新创建新的 table 并正确设置身份并重新设置种子值并设置 IDENTITY_INSERT ON 并将现有行插入新的 table & 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
- 创建一个以起始值作为补种值的序列,并将该序列用于您以后的插入。
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