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

时间:2016-02-11 11:56:31

标签: sql postgresql

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

  

cannot drop table users because other objects depend on it

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

3 个答案:

答案 0 :(得分:36)

使用cascade选项:

DROP TABLE if exists users cascade;

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

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

答案 1 :(得分:4)

如果确实需要删除该特定表,无论是否重新创建它,那么首先找到依赖它的对象。

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";

然后,

select top 99 * from admin.v_view_dependency where src_objectname like '%the_table_name_it_complaint_about%';

结果集将在字段&#34; dependant_objectname&#34;中显示依赖对象。

答案 2 :(得分:3)

通常,要删除几个相互依赖的表,您可以从没有任何依赖的表开始(具有将指向其他表的外键的表),并向后工作。例如,如果表transactions取决于表users,则首先删除transactions。简而言之:以与创建表格相反的顺序删除表格。

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