0

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

问题是这些查询需要很长时间——大约 9-11 秒!

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

我正在使用 Postgresql。

4

1 回答 1

1

我认为解决这个问题的方法如下:

  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。

于 2013-04-11T12:57:23.380 回答