postgresql 无法删除表用户,因为其他对象依赖于它

nmpmafwu  于 2024-01-07  发布在  PostgreSQL
关注(0)|答案(5)|浏览(240)

我想删除数据库中的表。但是,当我使用DROP TABLE if exists users;时,我会收到以下消息:
无法删除表用户,因为其他对象依赖于它
我发现解决方案是删除所有表。但是,无论如何,如何在不完全删除数据的情况下解决这个问题?

h5qlskok

h5qlskok1#

使用cascade选项:

DROP TABLE if exists users cascade;

字符串
这将删除引用users表或使用它的任何视图的任何外键。
它不会删除其他 * 表 *(或从中删除行)。

ogq8wdun

ogq8wdun2#

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

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%';


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

l5tcr1uw

l5tcr1uw3#

一般来说,要删除几个相互依赖的表,你可以从没有依赖的表开始(那些有指向其他表的外键的表),然后向后操作。例如,如果表transactions依赖于表users,你应该先删除transactions。简而言之:按照创建表的相反顺序删除表。
如果您设法创建具有循环依赖关系的表,则可以首先删除阻止删除的外键约束。(正如@a_horse在评论中解释的那样),将删除涉及已删除表的任何外键约束。但请注意,并非所有DBMS都支持CASCADE:Postgres可以,但MySQL不可以(关键字被接受,但没有效果)。

sqxo8psd

sqxo8psd4#

使用以下命令:

drop trigger "trigger_name" on "table_name";

字符串
根据这里的供应文件。

ecfdbz9o

ecfdbz9o5#

我创建了my_func()触发器函数,如下所示:

CREATE FUNCTION my_func() RETURNS trigger
AS $$
BEGIN
END;
$$ LANGUAGE plpgsql;

字符串
然后,我在test表上使用my_func()创建了my_t触发器,如下所示:

CREATE TRIGGER my_t AFTER UPDATE ON test
FOR EACH ROW EXECUTE FUNCTION my_func();


然后,我尝试删除my_func()触发器函数,如下所示:

DROP FUNCTION my_func;


但是,我得到了下面类似的错误:
错误:无法删除函数my_func(),因为其他对象依赖于它
表测试上的触发my_t取决于函数my_func()
提示:使用DROP ... CASCADE也删除依赖对象。
所以,我设置CASCADE如下所示,然后我可以删除my_func触发器函数和my_t触发器一起没有错误。* The doc详细解释了如何删除函数:

-- ↓ ↓ ↓ ↓
DROP FUNCTION my_func CASCADE;


或者首先,我在test表中删除了my_t触发器,如下所示。* The doc详细说明了如何删除触发器:

DROP TRIGGER my_t ON test;


然后,我可以删除my_func()触发器函数而不会出错,如下所示:

DROP FUNCTION my_func;

相关问题