SQL Server中能否分开创建系统版本表与主键?报错求助
在SQL Server中无法分开创建系统版本表与添加主键的原因及解决方案
不能通过独立脚本分别创建启用系统版本控制的表和添加主键,你遇到的报错“System version table must have primary key defined”是SQL Server的硬性要求导致的:启用系统版本控制(SYSTEM_VERSIONING = ON)的表,必须在启用该特性时就已经存在主键。
原因
系统版本表依赖主键关联主表与历史表的记录,确保数据版本追溯的一致性。当启用系统版本控制时,SQL Server会自动创建或关联对应的历史表,而历史表的结构必须与主表主键完全匹配,因此主表必须在启用系统版本控制前就定义好主键。
两种可行的解决方案
方案1:创建表时直接定义主键
CREATE TABLE test ( [ID] int IDENTITY(1,1) NOT NULL, [name] varchar (1024), [SysStart] [datetime2] (7) GENERATED ALWAYS AS ROW START NOT NULL, [SysEnd] [datetime2] (7) GENERATED ALWAYS AS ROW END NOT NULL, PERIOD FOR SYSTEM_TIME ([SysStart], [SysEnd]), -- 直接在表定义中添加主键约束 CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED (ID) ASC ) WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = TESTHISTORY, DATA_CONSISTENCY_CHECK = ON))
方案2:先建表不启用系统版本,添加主键后再启用
-- 第一步:创建表但暂不启用系统版本控制 CREATE TABLE test ( [ID] int IDENTITY(1,1) NOT NULL, [name] varchar (1024), [SysStart] [datetime2] (7) GENERATED ALWAYS AS ROW START NOT NULL, [SysEnd] [datetime2] (7) GENERATED ALWAYS AS ROW END NOT NULL, PERIOD FOR SYSTEM_TIME ([SysStart], [SysEnd]) ) -- 第二步:添加主键约束 ALTER TABLE Test ADD CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED (ID) ASC -- 第三步:启用系统版本控制 ALTER TABLE test SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = TESTHISTORY, DATA_CONSISTENCY_CHECK = ON))
内容的提问来源于stack exchange,提问作者Bhaskar Rai
相关产品推荐
相关产品推荐

