分区与外键问题:如何将Table1主键改回仅Id并创建外键
解决Table1分区与单一主键、外键引用的冲突问题
问题原因分析
- 主键修改失败:SQL Server中,分区表的聚集索引必须包含分区列(此处为
AddTimestamp)。你之前的主键是聚集复合键(Id, AddTimestamp),若直接改为仅Id的主键,聚集索引不再包含分区列,会触发分区方案与索引不匹配的错误。 - 外键创建失败:外键必须引用目标表的主键或唯一约束,当前Table1的主键是复合键,没有针对单一
Id的唯一约束,因此无法创建引用Id的外键。
解决方案一:保留复合聚集主键,添加唯一非聚集约束(推荐)
无需修改现有分区结构,仅给Id添加唯一约束即可满足外键引用需求:
步骤1:给Table1添加唯一非聚集约束
ALTER TABLE Table1 ADD CONSTRAINT UQ_Table1_Id UNIQUE NONCLUSTERED (Id);
步骤2:创建Table2并引用唯一约束
此时可直接创建外键,引用这个唯一约束:
CREATE TABLE Table2 ( Id INT PRIMARY KEY IDENTITY(1,1), Table1Id INT, SomeField3 VARCHAR(100), SomeField4 DECIMAL(10, 2), CONSTRAINT FK_Table2_Table1 FOREIGN KEY (Table1Id) REFERENCES Table1(Id) );
解决方案二:将主键改为单一非聚集主键,重新创建聚集分区索引
若坚持要让主键为单一Id,需将主键设为非聚集,同时创建包含分区列的聚集索引来支持分区:
步骤1:删除现有复合主键
ALTER TABLE Table1 DROP CONSTRAINT PK_Table1;
步骤2:创建单一非聚集主键
ALTER TABLE Table1 ADD CONSTRAINT PK_Table1 PRIMARY KEY NONCLUSTERED (Id);
步骤3:创建包含分区列的聚集索引(用于分区)
CREATE CLUSTERED INDEX CI_Table1_AddTimestamp ON Table1 (AddTimestamp, Id) ON PS_AddTimestamp (AddTimestamp);
注:聚集索引包含
AddTimestamp(分区列)和Id,确保索引唯一性,避免重复数据问题。
步骤4:创建Table2外键
此时Table1的主键是单一Id,可直接创建外键:
CREATE TABLE Table2 ( Id INT PRIMARY KEY IDENTITY(1,1), Table1Id INT, SomeField3 VARCHAR(100), SomeField4 DECIMAL(10, 2), CONSTRAINT FK_Table2_Table1 FOREIGN KEY (Table1Id) REFERENCES Table1(Id) );
验证结果
两种方案均可实现:
- Table1保持按
AddTimestamp分区 - Table1主键(或唯一约束)为单一
Id,支持Table2的外键引用
内容的提问来源于stack exchange,提问作者Ilya Murashkevich
相关产品推荐
相关产品推荐

