按主详细信息关系对表进行排序


每次启动单元测试时,我都需要从所有表中删除所有数据。现在我正在使用测试套件中包含的每个表的TRUNCATE TABLE "table_name" CASCADE

问题是,这些查询需要花费大量时间——大约9-11秒!

我希望能够用TRUNCATE语句替换那些TRUNCATE...CASCADE,但要做到这一点,我需要一个按主-细节(父子)关系(子级优先)排序的表列表。我可以手动创建一到两次这样的列表,但数据库每天都在变化。有没有办法按照这个顺序生成一个表列表?

我正在使用Postgresql。

解决此问题的方法如下:

  1. 推迟所有可延迟的约束并忽略它们。你不能有效地在不可延迟的外键中有循环,因为没有满足它们的插入顺序

  2. 我会构建一个存储过程,查找可延迟的外键并将它们全部延迟。这是相对琐碎的。

  3. 我会构建一个CTE,它会构建一棵外键约束树,然后按照到达它们的路径长度的顺序反向搜索它们,这样第一个表将是根据它们的键拥有最多表的表。

然而,这可能有些过头了。只有两个功能可能更容易:

  1. 函数1查看类中的每个关系,对于每个关系,问题:

    EXECUTE $e$ ALTER TABLE $e$ || quote_ident(relname) || $e$ disable trigger all $e$;

  2. 功能2的作用相反:

    EXECUTE $e$ ALTER TABLE $e$ || quote_ident(relname) || $e$ enable trigger all $e$;

在清除过程开始时调用函数1。在提交之前调用函数2。

最新更新