我无法通过仅在引用表中禁用 FK 约束来截断父表。我必须实际删除引用表中的约束才能截断父表。
我在第一次截断子表之后做了上述步骤.....所以我确实遵循了正确的顺序....我真的需要删除约束然后批量插入数据然后重新创建 FK 约束吗?
我无法通过仅在引用表中禁用 FK 约束来截断父表。我必须实际删除引用表中的约束才能截断父表。
我在第一次截断子表之后做了上述步骤.....所以我确实遵循了正确的顺序....我真的需要删除约束然后批量插入数据然后重新创建 FK 约束吗?
如果你想使用TRUNCATE
,那么是的,删除并重新创建约束是唯一的方法。
文档中的确认(有更多解释)
您不能在由 FOREIGN KEY 约束引用的表上使用 TRUNCATE TABLE;相反,使用没有 WHERE 子句的 DELETE 语句。因为没有记录 TRUNCATE TABLE,所以它不能激活触发器。
如果子表为空(或所有相关的 FK 值都设置为NULL
),您应该能够在DELETE
不禁用或删除约束的情况下从父表中获取。
TRUNCATE
但是,即使您禁用约束并且即使子表为空,您也无法使用。在这种情况下,SQL Server 在 DDL 级别检查约束是否存在,并在它检查数据是否违反约束之前很久就退出(因此表为空并不重要)。
所以,只DELETE
在你的情况下使用。除非你每天这样做 50,000 次,否则试图让它工作TRUNCATE
似乎很麻烦,收效甚微。