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, ...], ...}
我需要删除每个表名中的条目。但因为这些条目之间的关系可能有点复杂。我的想法分为几个步骤:
非空引用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)将不会触及它,因为它不可为空。