我想把我的表放在数据库中.但是,当我使用时,例如,
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表的任何外键或使用它的任何视图.
它不会删除其他表(或从中删除行).
如果确实需要删除该特定表(是否创建该表),则首先查找依赖于该表的对象。
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”中向您显示依赖对象。
一般来说,要删除多个相互依赖的表,您可以从不依赖任何内容的表(具有指向其他表的外键的表)开始,然后向后操作。例如,如果 tabletransactions依赖于 table users,那么您将首先删除transactions。简而言之:按照与创建表相反的顺序删除表。
如果您设法创建具有循环依赖关系的表,则可以首先删除阻止删除的外键约束。或者您可以使用修饰符CASCADE,它(如@a_horse 在注释中解释的那样)将删除涉及已删除表的任何外键约束。但请注意,并非所有 DBMS 都支持CASCADE:Postgres 支持,但 MySQL 不支持(关键字被接受但没有效果)。
| 归档时间: |
|
| 查看次数: |
29572 次 |
| 最近记录: |