TRUNCATE TABLE "table_name" CASCADE
。
问题是,这些查询需要花费大量时间——大约9-11秒!
我希望能够用TRUNCATE
语句替换那些TRUNCATE...CASCADE
,但要做到这一点,我需要一个按主-细节(父子)关系(子级优先)排序的表列表。我可以手动创建一到两次这样的列表,但数据库每天都在变化。有没有办法按照这个顺序生成一个表列表?
我正在使用Postgresql。
解决此问题的方法如下:
-
推迟所有可延迟的约束并忽略它们。你不能有效地在不可延迟的外键中有循环,因为没有满足它们的插入顺序
-
我会构建一个存储过程,查找可延迟的外键并将它们全部延迟。这是相对琐碎的。
-
我会构建一个CTE,它会构建一棵外键约束树,然后按照到达它们的路径长度的顺序反向搜索它们,这样第一个表将是根据它们的键拥有最多表的表。
然而,这可能有些过头了。只有两个功能可能更容易:
-
函数1查看类中的每个关系,对于每个关系,问题:
EXECUTE $e$ ALTER TABLE $e$ || quote_ident(relname) || $e$ disable trigger all $e$;
-
功能2的作用相反:
EXECUTE $e$ ALTER TABLE $e$ || quote_ident(relname) || $e$ enable trigger all $e$;
在清除过程开始时调用函数1。在提交之前调用函数2。