Tod*_*ang 4 sql-server partitioning
我正在使用 SQL Server 2008。
我有两张桌子PARTITIONTESTTABLE和PARTITIONTESTTABLESUB. PARTITIONTESTTABLESUB有一个外键PARTITIONTESTTABLE。我创建了分区,这两个表都已分区。我还从管理分区向导创建了临时表。
当我跑....
ALTER TABLE PARTITIONTESTTABLESUB SWITCH PARTITION 10 to [staging_PARTITIONTESTTABLESUB];
Run Code Online (Sandbox Code Playgroud)
...它运行成功。
但...
ALTER TABLE PARTITIONTESTTABLE SWITCH PARTITION 10 to [staging_PARTITIONTESTTABLE];
Run Code Online (Sandbox Code Playgroud)
...失败,错误:
ALTER TABLE SWITCH 语句失败。不允许 SWITCH,因为源表“Enterprise.MSH2.PARTITIONTESTTABLE”包含约束“staging_PARTITIONTESTTABLESUB_PARTITIONTESTTABLESUB_FK”的主键。
DDL:
CREATE TABLE [PARTITIONTESTTABLE](
[pkcol] [int] IDENTITY(1,1) NOT NULL,
[datacol1] [int] NULL,
[datacol2] [int] NULL,
[datacol3] [varchar](50) NULL,
[partitioncol] [datetime] NOT NULL,
CONSTRAINT [PK_PARTITIONTESTTABLE] PRIMARY KEY CLUSTERED
(
[pkcol] ASC,
[partitioncol] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)
CREATE TABLE [PARTITIONTESTTABLESUB](
[subpkcol] [int] IDENTITY(1,1) NOT NULL,
[fkcol] [int] NOT NULL,
[datacol1] [int] NULL,
[datacol2] [int] NULL,
[datacol3] [varchar](50) NULL,
[partitioncol] [datetime] NOT NULL,
CONSTRAINT [PK_PARTITIONTESTTABLESUB] PRIMARY KEY CLUSTERED
(
[subpkcol] ASC,
[partitioncol] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [PARTITIONTESTTABLESUB] WITH CHECK ADD CONSTRAINT [PARTITIONTESTTABLESUB_FK] FOREIGN KEY([fkcol], [partitioncol])
REFERENCES [PARTITIONTESTTABLE] ([pkcol], [partitioncol])
GO
ALTER TABLE [MSH2].[PARTITIONTESTTABLESUB] CHECK CONSTRAINT [PARTITIONTESTTABLESUB_FK]
GO
Run Code Online (Sandbox Code Playgroud)
正确的。如果有另一个依赖于带有 FK 的切换表的表,则无法进行切换。
想象一下,您有 PK 值 1、2、3,并且其中有一个外键。现在您想要切换出值 3,因此它必须检查 FK 表中是否未提及 3 - 这是一项大量工作,并且比分区切换所要执行的元数据操作要多得多。
......所以这是不允许的。在没有 FK 的情况下做到这一点。