我有一个包含大约10000条记录的表和一个不自动增量的标识列,我想更改它。通常我会删除列并重新添加标识,但问题是此列在很多其他表中用作外键,并且主列中有一些数字缺失。我知道我无法更改列以开始自动递增但有没有办法让新的自动递增列复制与原始列相同的数字并从结束开始?
答案 0 :(得分:0)
您应该可以执行以下操作。 Table_1是我希望更新的表,现在包括一个标识列,而该列只是一个简单的int之前。请注意,当它创建tmp_Table_1时,它正在创建一个标识列,该标识列将标识种子设置为889,因为我之前拥有的最大int id是888.然后脚本获取现有表中的所有数据并插入到tmp表中,然后删除旧表并将tmp表重命名为Table_1。通过将标识种子设置为889,您插入的下一行数据将自动插入id为890。这有意义吗?
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_Table_1
(
id int NOT NULL IDENTITY (889, 1),
name nchar(10) NULL
) ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_Table_1 SET (LOCK_ESCALATION = TABLE)
GO
SET IDENTITY_INSERT dbo.Tmp_Table_1 ON
GO
IF EXISTS(SELECT * FROM dbo.Table_1)
EXEC('INSERT INTO dbo.Tmp_Table_1 (id, name)
SELECT id, name FROM dbo.Table_1 WITH (HOLDLOCK TABLOCKX)')
GO
SET IDENTITY_INSERT dbo.Tmp_Table_1 OFF
GO
DROP TABLE dbo.Table_1
GO
EXECUTE sp_rename N'dbo.Tmp_Table_1', N'Table_1', 'OBJECT'
GO
ALTER TABLE dbo.Table_1 ADD CONSTRAINT
PK_Table_1 PRIMARY KEY CLUSTERED
(
id
) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
COMMIT