分区和外键问题

问题描述 投票:0回答:1

我在向

Table1
添加分区时遇到问题。

以前,该表的主键仅包含 Id 列,但是当我添加分区时,我必须在组合键中包含

AddTimestamp
。现在我想更改结构,使主键再次仅由
Id
组成,但这会导致在尝试在
Table2
中创建外键时出错。

问题描述:

  1. 分区:我创建了一个分区函数和分区方案来按时间戳拆分数据:
CREATE PARTITION FUNCTION PF_AddTimestamp (DATETIMEOFFSET(7))
AS RANGE LEFT FOR VALUES (
    '2020-01-01T00:00:00Z',
    '2021-01-01T00:00:00Z',
    '2022-01-01T00:00:00Z',
    '2023-01-01T00:00:00Z',
    '2024-01-01T00:00:00Z'
);

CREATE PARTITION SCHEME PS_AddTimestamp
AS PARTITION PF_AddTimestamp
TO ([PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY]);
  1. 创建
    Table1
    :我创建了带有分区和复合主键的表:
CREATE TABLE Table1
(
    Id INT NOT NULL,
    AddTimestamp DATETIMEOFFSET(7) NOT NULL DEFAULT SYSDATETIMEOFFSET(),
    SomeField1 VARCHAR(100),
    SomeField2 INT,
    CONSTRAINT PK_Table1 PRIMARY KEY (Id, AddTimestamp)
)
ON PS_AddTimestamp (AddTimestamp);

但是,当我尝试将主键更改为仅包含 Id 时,遇到以下错误:

关联的分区函数“PF_AddTimestamp”生成的分区多于方案“PS_AddTimestamp”中提到的文件组

  1. 创建
    Table2
    :我创建了
    Table2
    ,并使用外键引用
    Id
    中的
    Table1
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”中没有与外键“FK_Table2_Table1”中的引用列列表匹配的主键或候选键。

我希望

Table1
中的主键仅由
Id
组成,这样我就可以在
Table2
中成功创建引用
Table1 (Id)
的外键。

如何解决这个问题?

我将不胜感激有关此问题的任何建议或建议!

sql sql-server foreign-keys partitioning
1个回答
0
投票

如何解决这个问题?

一旦将 ID 设置为 PK,添加外键就不会遇到任何问题。 您将必须更改分区。 如果需要,您仍然可以按 ID 分区。

或者您可以有一列既是 PK 又是时间戳,例如 在 SQL Server 中的表上生成唯一的基于时间的 id

© www.soinside.com 2019 - 2024. All rights reserved.