sql-server - 对外键引用的表进行分区
问题描述
每月大约划分 20 个表。它们都有一个日期列,作为分区键。到目前为止一切都很好,但是许多分区表被一个或多个外键引用。这使我无法进行切换+删除分区。因为 SQL Server 给出了错误:
消息 50000,级别 16,状态 1,过程 HandleError,第 26 行 [批处理开始第 0 行]
该表不能被外键约束引用。
一种可能性是在切换前放弃约束并在切换后重新创建它们,正如您在屏幕截图中看到的那样,有很多 FK。另一种选择是在删除最旧的分区之前对每个受影响的表执行删除语句。但这需要时间,因为我们正在谈论数百万条记录/分区。
在 Oracle 中,这似乎没有问题。一旦 Oracle 发现不再有从 FK 到 PK 的引用,就可以删除分区。在 SQL Server 中没有。我试了一下只是为了确定。
有没有人更好地了解如何以优雅的方式解决这个问题?
解决方案
您可以只修改您的 FK 以不使用命令检查现有数据nockeck constraint
。然后分区切换将起作用。请看下面的例子。
CREATE PARTITION FUNCTION part_fun_test(int)
AS RANGE RIGHT FOR VALUES(10, 20, 30)
GO
CREATE PARTITION SCHEME part_schem AS PARTITION part_fun_test
ALL TO ([primary])
GO
CREATE TABLE Main_t(
id INT IDENTITY PRIMARY KEY CLUSTERED,
name VARCHAR(50)
) ON part_schem(id)
GO
CREATE TABLE Main_t_ref(
ID INT IDENTITY,
MainID INT CONSTRAINT FK_t FOREIGN KEY REFERENCES dbo.Main_t(id)
)
GO
CREATE TABLE Second_t(
id INT IDENTITY PRIMARY KEY CLUSTERED,
name VARCHAR(50)
)
INSERT INTO dbo.Main_t
( name )
DEFAULT VALUES
GO 30
ALTER TABLE dbo.Main_t SWITCH PARTITION 1 TO dbo.Second_t --error
GO
ALTER TABLE dbo.Main_t_ref NOCHECK CONSTRAINT FK_t
GO
ALTER TABLE dbo.Main_t SWITCH PARTITION 1 TO dbo.Second_t --no error
GO
推荐阅读
- android - 如果 Android 应用程序不进入 Play 商店,是否需要增加 versionCode?
- node.js - 如何在护照谷歌身份验证回调函数中获取用户个人资料数据?
- r - 是否有适当的方法将图像包含在 R Bookdown 项目的边距中?
- vba - 使用从 VBA 执行的 WinSCP 批处理脚本返回 FTP 上传的状态?
- python - Django-channels 是否可以发送消息并等待响应?
- assembly - 汇编 emu8086 - 如何打印两个相加的数字?
- reactjs - 不能在 JSX 属性中使用布尔值
- java - 无法启动 Maven 服务 - 找不到类#
- java - 从没有特定值的 Hashmap 中删除项目
- java - 同时比较数组中的字符串和整数