最近我又做了一项工作,这是以前活动的继续。
前面我写了一个文档,说明了如何在数据库中清空部分表;其中使用的办法是,Disable外键,Delete数据,Enable外键的办法。
现在不同了,老大又提出了更高的要求,要求不断外键,依次删除表中的数据,这可把我郁闷坏了。
想了几个办法,最初的办法是:
用PowerDesigner工具读取数据库,将所需要的表取出,然后检查其约束关系,从叶子删到根节点;然后我发现很痛苦,因为表很多,足足有300多张表,分属于各个不同的专业。所以可想而知,需要翻动多少个屏幕才能把约束关系看清楚;
然后我又想了一个办法,仍然是使用PowerDesigner;因为我发现了一个细节,那就是使用PD选择表之后,会从数据库中依次读取这些表,最后在日志里面会出现外键的建立日志;A表到B表,B表到C表,A表到C表,等等;那我就想把这些关系存到数据库表中,然后写一段程序将这些关系进行排序,生成最后的顺序;
但是这个办法有个问题,就是如何在PD的选择表界面上选中那300多张表;因为所有的表都不在一起,所以选择的难度很大。
这时候又有一个办法出现了,那就是使用PLSQLDeveloper工具导出数据库。使用PLSQL能够将数据库建库脚本导出,那么我就想,将数据库中的这些表按照建库顺序依次导出,然后逆向删除。
还有一个办法,那就是请各专业负责人来协助操作,由每个专业负责人提供每个专业的约束关系,由我分析各专业顺序,依次进行删除。
比较以上四个办法,我选择了3;说做就做,导出这300多张表的建表顺序,8000多行……汗一下。不过不怕,下面就是如何逆向找出数据库表了。其实数据库表顺序已经有了,只不过里面的垃圾信息太多。OK,我将这8000多行全部写进一个临时表,然后把记录中包含“Create Table”的记录挑出来OrderBy Desc,哈哈,果然一张表都没少。赶紧复制到UE中,将Create Table 替换成Delete From,在每行最后添上分号;然后就扔到数据库中执行了一遍。
Perfect!