Pimcore安装出错: * WITH RECURSIVE is required

什么是 CTE?

CTE(公用表表达式)也称为子句WITH,是一种 SQL 功能,它返回可供其他查询使用的临时数据集。由于它是临时结果,因此不会存储在任何地方,但仍然可以像引用任何其他表一样引用它。

CTE 有两种类型:非递归和递归。

WITH RECURSIVE查询也叫递归查询,语法如下:

WITH RECURSIVE cte_name AS (
    cte_query_definition (the anchor member)
 
    UNION ALL
 
    cte_query_definition (the recursive member)
)
 
 
SELECT *
FROM   cte_name;

如果您希望 CTE 是递归的,那么在WITH编写RECURSIVE关键字之后。然后一切如常:AS后面是带有 CTE 查询定义的括号。第一个查询定义称为锚成员。

要将锚成员与递归成员连接起来,需要使用UNION 或者UNION ALL命令。显然,递归成员是 CTE 的递归部分,它将引用 CTE 本身。

Pimcore安装出现的WITH RECURSIVE is required错误

解决这个问题的办法有两个:

一 注释检测代码段

找到 vendor/pimcore/pimcore/lib/Tool/Requirements.php,大约328

        $queryCheck = true;

        try {
            $db->executeQuery(
                'WITH RECURSIVE counter AS (
                    SELECT 1 as n UNION ALL SELECT n + 1 FROM counter WHERE n < 10
                )
                SELECT * from counter'
            );
        } catch (\Exception $e) {
            $queryCheck = false;
        }

        $checks[] = new Check([
            'name' => 'WITH RECURSIVE',
            'state' => $queryCheck ? Check::STATE_OK : Check::STATE_ERROR,
        ]);

把这段代码注释掉。

二 升级mysql至8.0

如果是新项目建议升级mysql,如果有很多老项目依赖更低版本的mysql还是建议使用方法一。

Post Comment