DROP TABLE ... CASCADE 不删除任何依赖表

sma*_*c89 7 postgresql foreign-key drop-table cascade

我对 psql 还是比较新的,当我决定尝试删除其他表由于外键关系而依赖的表时,我刚刚完成一项作业。我的期望是,任何对我要删除的表有外键引用的表都会(至少)删除它们的所有行并且该表也被删除。此情况并非如此。这些表仍然存在,即使我指定了CASCADE,这些表的行也没有发生任何变化。

但是TRUNCATE ... CASCADE,在引用的表上使用实际上会删除其他表中的行

编辑: 好的,我理解它这样做是因为这是文档指定的方式,但我现在的问题是,这是什么时候预期的行为?

  • 使用 CASCADE 删除域会删除使用该域的任何表中的每一列。
  • 删除带有附加视图的表将删除该视图。

为什么删除一个被其他表引用的表不会删除引用这个表的表是有意义的?方便吗?

And*_*y M 7

DROP CASCADE 背后的想法是自动删除依赖对象。这记录在同一手册页其他答案指的是:

CASCADE

自动删除依赖于表的对象(如视图)。

(强调我的。)

当你删除一个被另一个表引用的表时,直接依赖于被删除的表的对象不是另一个表本身,而是定义在它上面的外键约束。

因此,您所观察到的行为应符合预期,因为它与您提到的其他情况一致:

  • DROP TABLE ... CASCADE 删除直接依赖于您要删除的表的视图。

  • DROP DOMAIN ... CASCADE 删除直接依赖于您要删除的域的列。

  • TRUNCATE ... CASCADE也与上面的解释一致,因为它删除了行,并且依赖于行的对象只能是其他行,包括其他表的行 - 这就是引用表也被截断的原因1


1我对其他表截断的唯一问题是它们的外键可能定义在可为空的列上,但即使它们的某些行不引用在 TRUNCATE 语句中指定的表,这些仍然被完全截断。尽管如此,即使它是不一致的,它也是记录行为的方式:

CASCADE

自动截断所有具有对任何命名表的外键引用的表,或由于CASCADE.


小智 6

这是它的记录方式

CASCADE 将完全删除依赖视图,但在外键情况下,它只会删除外键约束,而不是完全删除另一个表。

强调我的