当子表为空时截断 Oracle 中的父表

Isa*_*man 4 oracle referential-integrity truncate

假设我有一个parent由子表引用的父表child。该表parent已填充但未填充child。试图截断parent结果

 ORA-02449: unique/primary keys in table referenced by foreign keys  
Run Code Online (Sandbox Code Playgroud)

有没有办法向child空的 DBMS 提示,以便不需要禁用外键约束?

ik_*_*elf 12

不,没有这样的提示。你能做的是

alter table {child_table} disable constraint {fk_constraint_name};
truncate table {parent_table};
alter table {child_table} enable constraint {fk_constraint_name};
Run Code Online (Sandbox Code Playgroud)


Ale*_*ole 8

截断表限制包括:

您不能截断已启用的外键约束的父表。您必须在截断表之前禁用约束。一个例外是,如果完整性约束是自引用的,您可以截断表。

这大概是因为 truncate 是 DDL,并且不会对目标表中的数据进行任何检查,甚至不检查它是否有任何行。它必须执行该 DML,并在所有子表中查找任何匹配的行(或至少检查没有行)等,这会改变命令的性质并可能影响性能。并且它必须考虑针对子表的未提交事务,如果没有延迟约束,它会预期插入错误而不是提交错误。

这样做的唯一方法是禁用或删除约束,如@ik_zelf 所示。