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