PostgreSQL 42P19: invalid_recursion 报错 故障修复 远程处理

文档解释

42P19: invalid_recursion

错误说明

“invalid_recursion” 错误是 PostgreSQL 消息中最常见的类型之一,它们有助于提醒创建者,因为他们试图执行递归操作,而这不被 PostgreSQL 数据库所支持,并发现了一些有潜在问题的内容。

常见案例

此错误出现的情况很普遍,主要特征是一组 SQL 语句试图通过它们自己的子句来访问自身,因此,此过程被视为无效递归操作。例如,下面的简单代码示例会引发无效递归的错误:

SELECT * FROM table_name

WHERE ID IN (SELECT ID FROM table_name);

上面的代码将导致 “invalid_recursion” 错误,因为 WHERE 子句的查询试图访问自身。另一个典型的情况是触发一组 SQL 语句,它们尝试从同一表中检索数据,并希望在这种情况下,可以使用不同的 Between 字句来匹配不同的筛选标准:

SELECT * FROM table_name

WHERE (Date1 Between ‘2013-01-01’ And ‘2013-01-30’)

AND (Date2 Between ‘2013-02-01’ And ‘2013-02-28’);

解决方法

要解决 “invalid_recursion” 错误,必须用另一种方法重新编写 SQL 语句,以便不需要访问自身,而只有在这种情况下,才能保证有效性。例如,对于上面的示例,可以使用 LEFT JOIN 来解决上述问题:

SELECT t1.ID

FROM table_name AS t1

LEFT JOIN table_name AS t2

ON t1.ID = t2.ID;

此外,还可以结合使用临时表,而无需试图访问同一表:

SELECT *

FROM table_name

INNER JOIN

(SELECT ID FROM table_name) AS temp_table

ON table_name.ID = temp_table.ID;

这是典型的无效递归的案例,通过使用 LEFT 连接或临时表,可以很容易地解决此类问题,从而避免尝试读取自身的内容所带来的问题。


数据运维技术 » PostgreSQL 42P19: invalid_recursion 报错 故障修复 远程处理