如何为已有数据的SQL Server时态表添加IDENTITY列?
时态表添加IDENTITY列的解决方案
可以给时态表添加IDENTITY列,但不能在系统版本控制启用的状态下直接操作,需要按照以下步骤执行:
报错原因
当时态表启用系统版本控制时,主表与历史表的架构必须严格一致。尝试给主表添加IDENTITY列时,SQL Server会自动尝试为历史表也配置相同的IDENTITY属性,但历史表不允许存在IDENTITY列,因此触发错误。
具体操作步骤
关闭系统版本控制
先断开主表与历史表的版本关联:ALTER TABLE dbo.tArticle SET (SYSTEM_VERSIONING = OFF); GO为主表添加IDENTITY列
此时可以正常执行添加操作:ALTER TABLE dbo.tArticle ADD operationId INTEGER IDENTITY(1,1) NOT NULL; GO为历史表添加对应普通列
历史表不能设置IDENTITY属性,需添加同类型的普通列,并为已有数据设置默认值:ALTER TABLE dbo.tArticleHistory ADD operationId INTEGER NOT NULL DEFAULT 0; GO -- 若需要将历史表的operationId与主表对应数据关联,可执行以下更新(可选) -- UPDATE h -- SET h.operationId = t.operationId -- FROM dbo.tArticleHistory h -- INNER JOIN dbo.tArticle t ON h.articleId = t.articleId;重新启用系统版本控制
重新关联主表与历史表,开启版本控制:ALTER TABLE dbo.tArticle SET ( SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.tArticleHistory) ); GO
注意事项
- 重新启用系统版本控制前,主表与历史表的架构必须完全匹配(列名、数据类型、nullable属性一致)
- 历史表中新增的列只能是普通列,不能设置IDENTITY属性
- 若有需要,可在关闭版本控制期间完成历史表数据与主表的同步
内容的提问来源于stack exchange,提问作者stranges
相关产品推荐
相关产品推荐

