Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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
Postgresql Postgres:如何删除多个表中的条目_Postgresql_Metadata_Topological Sort - Fatal编程技术网

Postgresql Postgres:如何删除多个表中的条目

Postgresql Postgres:如何删除多个表中的条目,postgresql,metadata,topological-sort,Postgresql,Metadata,Topological Sort,我有一个任务,就是为来自不同表的一批条目实现一个“回滚”(不是通常的回滚)函数。例如: def rollback(cursor, entries): # entries is a dict of such form: # {'table_name1': [id1, id2, ...], 'table_name2': [id1, id2, ...], ...} 我需要删除每个表名中的条目。但因为这些条目之间的关系可能有点复杂。我的想法分为几个步骤: 从所有可为空的表中找出所有列

我有一个任务,就是为来自不同表的一批条目实现一个“回滚”(不是通常的回滚)函数。例如:

def rollback(cursor, entries):
    # entries is a dict of such form: 
    # {'table_name1': [id1, id2, ...], 'table_name2': [id1, id2, ...], ...}
我需要删除每个表名中的条目。但因为这些条目之间的关系可能有点复杂。我的想法分为几个步骤:

  • 从所有可为空的表中找出所有列
  • 更新所有条目将所有可为null的列设置为null。在此步骤之后,应该没有循环依赖项(如果没有,我认为它们不能插入到表中)
  • 找出它们的依赖项并进行拓扑排序
  • 逐条删除
  • 我的问题是:

  • 这个想法有意义吗
  • 以前有人做过类似的事情吗?怎么做
  • 如何查询步骤3的元表?因为我对postgresql还很陌生
  • 任何想法和建议都将不胜感激。

    (1)和(2)不正确。很可能会定义列
    非空引用othertable(othercol)
    ——在任何正常模式中都有

    我认为您需要做的是对外键依赖关系图进行排序,以找到一个顺序,允许您逐表删除需要删除的数据。请注意,由于延迟外键约束,循环依赖是可能的,因此您需要降级/忽略
    delferrable INITIALLY delferred
    约束;只要在
    COMMIT
    时间再次保持一致,就可以暂时违反这些规则

    即使这样,你也可能会遇到问题。如果在交易过程中,客户习惯于使
    可延迟最初立即
    约束
    延迟
    ,该怎么办?然后,您将无法处理循环依赖。要处理此问题,您的代码必须在继续之前[
    设置所有延迟的约束

    您将需要查看或特定于PostgreSQL的,以确定依赖项。也许值得一看
    pg_dump
    源代码,因为它试图对转储的表排序,以避免依赖冲突。你会特别感兴趣的 目录,或其
    信息模式
    等价物
    信息模式.参考约束
    信息模式.约束表的使用
    信息模式.约束列的使用


    您可以使用
    信息\u模式
    pg\u目录
    。不要两者都用
    information\u schema
    是SQL标准,更具可移植性,但查询速度较慢,并且没有包含所有的
    pg\u catalog
    信息。另一方面,
    pg_catalog
    的模式不能保证在主要版本(如9.1到9.2)之间保持兼容,尽管它通常是兼容的,而且它的使用也不可移植。

    我不得不问,为什么?这是一个非常奇怪的问题,它要么是一个作业,要么是那些你有问题要解决的事情之一,你已经决定这是最好的解决方案,你问我们一个有最好解决方案的问题。如果是后者,它可能有助于解释潜在的问题,即您通过这样做试图实现的最终结果。此外,“回滚”实际上是指“删除”吗?回滚意味着撤消更改或恢复以前的内容。您似乎只是想从可能具有相互依赖的外键关系的不同表中删除一组行。@CraigRinger thx,请回答。这不是一个家庭作业:)事实上,我正在做一个导入/导出数据项目,系统中有许多表,可能需要向其中一些表导入/导出数据。有一个功能是撤消导入。所以我使用了“rollback”这个名称,可能不太合适:)不管怎样,问题只是按照您所说的删除一组行,这样做会更容易。记录插入数据的顺序,并在删除时向后回放该顺序。使用审核日志。@CraigRinger-Hmm,我将尝试这两种方法,再次感谢。对于“非空引用othertable(othercol)”(1)和(2)将不会触及它,因为它不可为空。