You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 02:10:20