首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按主详细关系对表进行排序

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

Stack Overflow用户
提问于 2012-10-11 19:25:01
回答 1查看 110关注 0票数 0

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

问题是这些查询花费了很多时间--大约9-11秒!

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

我使用的是Postgresql。

EN

回答 1

Stack Overflow用户

发布于 2013-04-11 20:57:23

我解决这个问题的方式如下所示:

  1. 会延迟所有可推迟的约束并忽略它们。你不能有效地在不可延迟的外键中有循环,因为没有满足它们的插入顺序,
  2. ,我会构建一个存储过程来查找可延迟的外键,并将它们全部延迟。这是相对微不足道的。
  3. 我会构建一个CTE,它将构建一个外键约束树,然后按照到达它们的路径长度的颠倒顺序来搜索它们,这样第一个表就是那些根据它们的键拥有最多表的表。

然而,这可能是过度杀伤力。只有两个函数可能会更容易:

  1. 函数1检查类中的每个关系,并对每个关系发出以下命令:

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

  • Function 2做了相反的事情:

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12838421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档