2012-02-04 168 views
0

我想刪除表中沒有外鍵依賴關係的行。如果它們確實存在,則應將行標記爲「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

爲什麼不是總是設置'deadfiled'並且不打擾是否存在依賴關係?無論如何,你必須過濾'deadfiled'才能將生命與殭屍行分開。我懷疑物理刪除一些行會給你任何可衡量的性能提升。 – 2012-02-05 11:51:38

+0

或做到這一點,並有一些「清理」任務,刪除沒有引用的死行。你甚至可以稱它爲「autovacuum」;) – araqnid 2012-02-05 17:05:19

回答

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 
+0

當然,你的建議很有效,但如果關係涉及許多表格,則需要大量編碼。 – Mophilly 2012-02-04 20:38:18

+0

在閱讀您的問題時,我意識到您認爲我正在刪除依賴關係。這不是打算的。 – Mophilly 2012-02-04 20:44:09

+0

@Mophilly不,我看到你想刪除依賴的依賴者,而不是依賴者。對於存在很多依賴性時需要付出的努力,您提出了一個很好的觀點。 – 2012-02-04 20:51:41