欢迎光临
我们一直在努力

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 连接或临时表,可以很容易地解决此类问题,从而避免尝试读取自身的内容所带来的问题。

赞(0)
【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。