如何放弃继承?

use*_*675 5 postgresql inheritance

我是 PostgreSQL 的新手。我遇到的情况是有人创建了一个从父表继承的子表。并丢弃了子表。但是父表上仍然有“向下箭头”标志。

我检查过,父表上没有其他链接/关系。这真的是个问题吗?

有人告诉我,父表仍处于“已继承”状态并导致性能问题。如何解决这个问题?通过从父表中删除“已继承”状态?

Erw*_*ter 12

除了@Josh 已经澄清的内容之外,手册中的句话应该回答标题中的问题:

[...]一个继承链可以使用的一个孩子取出NO INHERIT的变种ALTER TABLE

ALTER TABLE child NO INHERIT parent;
Run Code Online (Sandbox Code Playgroud)

要么就是删除child表。

此外,您可以在使用CASCADE关键字删除父表时包括所有继承表:

不能删除父表,而其任何子表仍保留。[...] 如果您希望删除一个表及其所有子表,一种简单的方法是使用该CASCADE选项删除父表。

您可以反转它以利用该行为并调试您的情况。启动事务并尝试删除父表:

BEGIN;
DROP TABLE a;
Run Code Online (Sandbox Code Playgroud)
ERROR:  cannot drop table a because other objects depend on it
DETAIL:  table b depends on table a
HINT:  Use DROP ... CASCADE to drop the dependent objects too.
Run Code Online (Sandbox Code Playgroud)

错误消息列出了阻止DROP命令的继承表。

除非出现错误(自动中止事务),ROLLBACK如果您实际上不想删除表,请确保发出 a :

ROLLBACK;
Run Code Online (Sandbox Code Playgroud)


Jos*_*kus 6

如果您使用的是最新版本的 PostgreSQL(即 9.1 或更高版本),请执行以下操作:

  1. 使用 psql 命令行客户端登录到您的数据库
  2. \d+ <表名>

... 其中 <tablename> 是您的父表的名称。这将为您提供从输出底部的父表继承的表列表。

没有所谓的“被继承”状态。表要么有继承子项,要么没有。