1

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

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

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

我唯一的想法是前后转储数据库并检查它。但是看起来不太舒服。另一个想法 - 转储数据库的一部分,正如我认为的那样,它不应该受到我的 DELETE 语句的影响,并在数据删除之前和之后检查这部分。但我认为没有简单的方法可以做到这一点(有数百个表,删除应该与其中的 10 个一起使用)。有什么办法吗?

任何其他想法如何解决这个问题?

4

4 回答 4

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
于 2008-09-25T08:23:43.453 回答
1

使用 psql,启动一个事务,执行你的删除操作,然后运行你能想到的任何检查查询。然后,您可以回滚或提交。

于 2008-09-25T11:58:41.847 回答
0

如果担心键悬空(即:指向已删除的记录),则在您的测试数据库上运行删除,然后使用查询查找现在指向无效目标的任何键。(当你这样做时,你还可以确保应该不受影响的部分没有改变)

更好的解决方案是花时间映射删除级联,以便您知道会发生什么 - 了解数据库的工作方式非常有价值,因此在此特定删除之外花费的精力将很有用。

而且,无论您多么确定在进行重大更改之前备份数据库!

于 2008-09-25T08:15:35.393 回答
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
于 2008-09-25T08:57:05.900 回答