不能删除表用户,因为其他对象依赖于它

Vya*_*lav 22 sql postgresql

我想把我的表放在数据库中.但是,当我使用时,例如, DROP TABLE if exists users; 我收到此消息:

cannot drop table users because other objects depend on it

我发现解决方案是删除所有数据库.但是,无论如何,如何在没有全面数据删除的情况下解决这个问题?

a_h*_*ame 43

使用cascade选项:

DROP TABLE if exists users cascade;
Run Code Online (Sandbox Code Playgroud)

这将删除引用该users表的任何外键或使用它的任何视图.

它不会删除其他(或从中删除行).

  • 它还会删除引用您的表的所有视图。 (3认同)
  • @PaulinTrognon:不,它只删除引用该表和表本身的外键约束,不会删除或删除任何其他内容 (2认同)
  • 在我的例子中,它实际上删除了两个表,所以要注意。我相信发生这种情况是因为我通过继承第一个表创建了第二个表! (2认同)

dat*_*789 9

如果确实需要删除该特定表(是否创建该表),则首先查找依赖于该表的对象。

CREATE OR REPLACE VIEW admin.v_view_dependency AS 
SELECT DISTINCT srcobj.oid AS src_oid
  , srcnsp.nspname AS src_schemaname
  , srcobj.relname AS src_objectname
  , tgtobj.oid AS dependent_viewoid
  , tgtnsp.nspname AS dependant_schemaname
  , tgtobj.relname AS dependant_objectname
FROM pg_class srcobj
  JOIN pg_depend srcdep ON srcobj.oid = srcdep.refobjid
  JOIN pg_depend tgtdep ON srcdep.objid = tgtdep.objid
  JOIN pg_class tgtobj ON tgtdep.refobjid = tgtobj.oid AND srcobj.oid <> tgtobj.oid
  LEFT JOIN pg_namespace srcnsp ON srcobj.relnamespace = srcnsp.oid
  LEFT JOIN pg_namespace tgtnsp ON tgtobj.relnamespace = tgtnsp.oid
WHERE tgtdep.deptype = 'i'::"char" AND tgtobj.relkind = 'v'::"char";
Run Code Online (Sandbox Code Playgroud)

然后,

select top 99 * from admin.v_view_dependency where src_objectname like '%the_table_name_it_complaint_about%';
Run Code Online (Sandbox Code Playgroud)

结果集将在字段“ dependant_objectname”中向您显示依赖对象。


ale*_*xis 5

一般来说,要删除多个相互依赖的表,您可以从不依赖任何内容的表(具有指向其他表的外键的表)开始然后向后操作。例如,如果 tabletransactions依赖于 table users,那么您将首先删除transactions。简而言之:按照与创建表相反的顺序删除表。

如果您设法创建具有循环依赖关系的表,则可以首先删除阻止删除的外键约束。或者您可以使用修饰符CASCADE,它(如@a_horse 在注释中解释的那样)将删除涉及已删除表的任何外键约束。但请注意,并非所有 DBMS 都支持CASCADE:Postgres 支持,但 MySQL 不支持(关键字被接受但没有效果)。