Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 无法删除表用户,因为其他对象依赖于它_Sql_Postgresql - Fatal编程技术网

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

Sql 无法删除表用户,因为其他对象依赖于它,sql,postgresql,Sql,Postgresql,我想删除数据库中的表。 但是,当我使用,例如, 如果存在用户,则删除表; 我收到这个消息: 无法删除表用户,因为其他对象依赖于它 我发现解决办法是删除所有表。但是,无论如何,如何在不完全删除数据的情况下解决此问题?使用级联选项: 这将删除引用users表或使用它的任何视图的任何外键 它不会删除其他表或删除其中的行。通常,要删除多个相互依赖的表,您可以从不依赖外键指向其他表的表开始,然后向后操作。例如,如果表事务依赖于表用户,则首先删除事务。简而言之:按与创建表的顺序相反的顺序删除表 如果您设法创

我想删除数据库中的表。 但是,当我使用,例如, 如果存在用户,则删除表; 我收到这个消息:

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

我发现解决办法是删除所有表。但是,无论如何,如何在不完全删除数据的情况下解决此问题?

使用级联选项:

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


它不会删除其他表或删除其中的行。

通常,要删除多个相互依赖的表,您可以从不依赖外键指向其他表的表开始,然后向后操作。例如,如果表事务依赖于表用户,则首先删除事务。简而言之:按与创建表的顺序相反的顺序删除表


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

如果确实有必要删除该特定表并重新创建或不重新创建该表,则首先查找依赖该表的对象

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

结果集将在Dependent_objectname字段中显示Dependent对象。

根据外键约束,您需要根据条件删除Dependent对象请仔细考虑您正在执行的操作。首先从证明需要删除表开始。从表2中删除,其中t.Col1在中从表1中选择1,其中tt.Col1=t.Col1删除后,现在删除要删除的表delete@mohan111:删除引用表中的行毫无帮助。需要删除外键。需要使用外键检查和修改每个记录-这显然是错误的。cascade选项不会检查引用表中的所有行,它只是删除外键。它不会删除任何数据。我按照您的描述:要删除正在使用users表的外键,您需要修改包含外键的记录。但实际上建议删除整个子表,而不仅仅是记录或键:自动删除依赖于表的对象,例如视图。您能澄清一下吗?在这种情况下,依赖对象是外键约束,而不是表。放下桌子。。。cascade不会删除其他表中的任何行,也不会删除DDL语句中提到的表以外的任何其他表。请看这里的证据:感谢您的澄清!更正。如果使用“级联”选项删除数据库用户,它将删除所有从属对象。例如,用户拥有的所有表以及这些表中的所有数据。因此,在使用“cascade”时,可能会意外地丢失所有数据和架构。它会删除依赖于用户的其他表中的行吗?@PaulinTrognon:不会,它只会删除引用该表和表本身的外键约束,不会删除任何其他内容,droppedIt也会删除引用您的表的任何视图。在我的情况下,它实际上删除了两个表,所以请注意。我相信这是因为我通过继承第一个表创建了第二个表!这是正确的,希望得到此错误的其他对象不能删除表用户,因为依赖它的其他对象在检查约束是什么之前不会犯同样的错误。只是想分享一下
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%';