我想把我的表放在数据库中。
但是,当我使用时,例如,
DROP TABLE if exists users;
我收到此消息:
cannot drop table users because other objects depend on it
我发现解决方案是删除所有数据库。但是,无论如何,如何在没有全部数据删除的情况下解决这个问题?
答案 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不支持(关键字被接受但没有效果)。