如何检查是否仅删除了必需的数据?

时间:2020-03-06 14:42:32  来源:igfitidea点击:

我有一个非常大的数据库(在PostgreSQL上运行),其中包含很多表,表之间具有复杂的关系(外键,删除级联等)。
我需要从多个表中删除一些数据,但是由于级联删除,我不确定从数据库中真正删除多少数据。

如何检查我不会删除不应删除的数据?

我有一个测试数据库,只是真实数据库的一个副本,可以在其中执行我想做的事情:)

我唯一的想法是在转储数据库之前和之后对其进行检查。但这看起来并不舒服。
我认为,数据库的另一个想法转储部分应该不受我的DELETE语句的影响,并在数据删除之前和之后检查此部分。但是我发现没有简单的方法可以做到(有数百张表,删除应该可以处理约10张表)。有什么办法吗?

还有其他想法如何解决问题?

解决方案

如果担心的是键悬空(即指向已删除的记录),然后在测试数据库上运行删除操作,然后使用查询查找现在指向无效目标的任何键。 (在执行此操作时,我们还可以确保不受影响的部分没有发生变化)

更好的解决方案是花时间规划删除级联,这样我们就知道知道数据库的工作方式是非常有价值的,因此在此工作上花费的精力将超出此特定的删除范围。

而且,无论我们如何确定在进行大的更改之前都要备份数据库!

我们可以查询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

感谢回答!

Vinko,回答对我非常有用,我将研究它。

实际上,就我而言,比较记录删除前后的表计数并检查受其影响的表就足够了。

这是通过下面描述的简单命令完成的

psql -U U_NAME -h`hostname` -c '\d' | awk '{print }' > 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

使用psql,启动事务,执行删除,然后运行我们可以想到的所有检查查询。然后,我们可以回滚或者提交。