检测对删除的依赖性

时间:2012-02-04 17:55:59

标签: sql postgresql

我想从没有外键依赖关系的表中删除行。如果它们确实存在,则应将行标记为“deadfiled”以保持关系完整性。目标是仅保留必要的数据。

删除只影响一行;它不会触发级联删除,也不会尝试删除依赖项。例如,客户行在许多其他表中引用,例如发票,协议,变更单等,该客户行应标记为“deadfiled”。如果没有这样的引用,则可以从表中删除客户行。

我正在寻找有关从客户端应用程序代码处理此问题的最佳方法的建议。我正在使用PostgreSQL 9.1。

这是当前的方法,它依赖于Postgres对外键依赖的“知识”:

Begin transation
delete row x
if SQLSTATE Error Code = 23503
  update row set deadfiled = true
if success
  commit transaction
else rollback

在某些帖子中,似乎上述方法被认为是脆弱的。有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

我从来没有真正使用过PostgreSQL,但它看起来像是你使用基于游标的方法。

基于集合的解决方案呢?

运行更新查询,检查是否存在依赖项并标记这些记录......

update parent 
set deadfiled = true
where
    exists (
        select *
        from dependency1 as d1
        where d1.id = parent.id
    )
    or
    exists (
        select *
        from depenedency2 as d2
        where d2.id = parent.id
    )
    --or ... etc.,  keep adding dependency checks

...然后删除未设置标志的那些:

delete from parent where deadfiled = false