2008-09-25 77 views
1

我有一個非常大的數據庫(在PostgreSQL上運行),它包含許多具有複雜關係的表(外鍵,刪除級聯等)。 我需要從多個表中刪除一些數據,但我不確定由於級聯刪除從數據庫中真正刪除了多少數據。如何檢查我是否只刪除了所需的數據?

我如何檢查我不會刪除不應該被刪除的數據?

我有一個測試數據庫 - 只是一個真正的副本,我可以做我想做的:)

我唯一的想法是轉儲數據庫之前和之後進行檢查。但它看起來不舒服。 另一個想法 - 轉儲數據庫的一部分,我認爲,不應該受到我的DELETE語句的影響,並在數據刪除之前和之後檢查這部分。但我沒有看到簡單的方法來做到這一點(有數百個表格,刪除應該與約10個工作)。有沒有辦法做到這一點?

其他想法如何解決問題?

回答

1

可以查詢INFORMATION_SCHEMA繪製自己的約束是如何在數據庫中定義的圖片。然後你會知道刪除時會發生什麼。這不僅對於這種情況有用,而且總是有用的。

喜歡的東西(的限制)

select table_catalog,table_schema,table_name,column_name,rc.* from 
information_schema.constraint_column_usage ccu, 
information_schema.referential_constraints rc 
where ccu.constraint_name = rc.constraint_name 
0

如果擔心的是鍵左晃來晃去(即:指向一個已刪除的記錄),那麼在您的測試數據庫中運行刪除,然後使用查詢發現,現在指向無效的目標的任何按鍵。 (當你這樣做時,你也可以確保應該不受影響的部分不會改變)

一個更好的解決方案是花時間映射出刪除級聯,這樣你就知道該期待什麼 - 瞭解數據庫的方式作品是非常有價值的,所以在這個特定的刪除之外花費在這方面的努力將會有用。

不管你是多大的把握做得大的變化之前回DB了!

0

謝謝解答!

Vinko,你的答案是對我非常有用,我會研究它杓。

其實,我的情況,這已經足夠了比較表之前和之後刪除記錄計數和檢查受到影響哪些表被它。

它是由以下

psql -U U_NAME -h`hostname` -c '\d' | awk '{print $3}' > tables.list 

for i in `cat tables.list `; do echo -n "$i: " >> tables.counts; psql -U U_NAME -h`hostname` -t -c "select count(*) from $i" >> tables.counts; done 

for i in `cat tables.list `; do echo -n "$i: " >> tables.counts2; psql -U U_NAME -h`hostname` -t -c "select count(*) from $i" >> tables.counts2; done 

diff tables.counts tables.counts2 
1

描述使用PSQL簡單的命令完成後,啓動一個事務,執行您刪除,然後運行任何檢查查詢,你能想到的。然後您可以回滾或提交。

相關問題