sma*_*c89 7 postgresql foreign-key drop-table cascade
我对 psql 还是比较新的,当我决定尝试删除其他表由于外键关系而依赖的表时,我刚刚完成一项作业。我的期望是,任何对我要删除的表有外键引用的表都会(至少)删除它们的所有行并且该表也被删除。此情况并非如此。这些表仍然存在,即使我指定了CASCADE
,这些表的行也没有发生任何变化。
但是TRUNCATE ... CASCADE
,在引用的表上使用实际上会删除其他表中的行
编辑: 好的,我理解它这样做是因为这是文档指定的方式,但我现在的问题是,这是什么时候预期的行为?
为什么删除一个被其他表引用的表不会删除引用这个表的表是有意义的?方便吗?
DROP CASCADE 背后的想法是自动删除依赖对象。这记录在同一手册页上其他答案指的是:
CASCADE
自动删除依赖于表的对象(如视图)。
(强调我的。)
当你删除一个被另一个表引用的表时,直接依赖于被删除的表的对象不是另一个表本身,而是定义在它上面的外键约束。
因此,您所观察到的行为应符合预期,因为它与您提到的其他情况一致:
DROP TABLE ... CASCADE
删除直接依赖于您要删除的表的视图。
DROP DOMAIN ... CASCADE
删除直接依赖于您要删除的域的列。
TRUNCATE ... CASCADE
也与上面的解释一致,因为它删除了行,并且依赖于行的对象只能是其他行,包括其他表的行 - 这就是引用表也被截断的原因1。
1我对其他表截断的唯一问题是它们的外键可能定义在可为空的列上,但即使它们的某些行不引用在 TRUNCATE 语句中指定的表,这些表仍然被完全截断。尽管如此,即使它是不一致的,它也是记录行为的方式:
CASCADE
自动截断所有具有对任何命名表的外键引用的表,或由于
CASCADE
.