2008-09-25 68 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简单的命令完成后,启动一个事务,执行您删除,然后运行任何检查查询,你能想到的。然后您可以回滚或提交。

相关问题