MariaDB:某些查询没有选择数据库错误

MariaDB: No database selected error on some query

我有一个 php 代码可以针对 MariaDB(在 debian 11 上使用 MariaDB 10.5.11)table 发起查询;我使用 php-mysql 为此任务准备的查询,如下面的代码所示:

if($this->dbcon->begin_transaction() === false) {
        $this->errNum = -1;
        $this->errText = "Unable to start transaction: " . $this->dbcon->errno . " - " . $this->dbcon->error;
        return false;
}

try {
    $query = file_get_contents("recursivelyRemoveShares.sql");   // (1) If replaced with a SELECT works fine!

    if($query === false) {
        $this->errNum = -1;
        $this->errText = "Unable to read query (0)";
        return false;
    }

    $stmt = $this->dbcon->prepare($query);      // Err 1046: No database selected
    if($stmt === false) {
        $this->errNum = -1;
        $this->errText = "Unable to prepare statement: " . $this->dbcon->errno . " - " . $this->dbcon->error;
        return false;
    }
    
    $stmt->bind_param("s", $uuid);
    $stmt->execute();

    // Commit transaction
    $this->dbcon->commit();
} catch (Exception $ex) {
    // Rollback transaction if something goes wrong
    $this->dbcon->rollback();
    
    $this->errNum = $this->dbcon->errno;
    $this->errText = $this->dbcon->error;
    return false;
}

当 运行 $stmt = $this->dbcon->prepare($query); 数据库引发 Err 1046: No database selected;但是在成功执行之前我做了一些其他操作,使用相同的数据库连接。

这是我用 file_get_contents 阅读的查询:

DELETE FROM `shares` WHERE `itemuuid` in (
  WITH RECURSIVE files_paths (id, parent) AS
  (
    SELECT uuid, parentuuid
      FROM core_data
      WHERE uuid = ?
    UNION ALL
    SELECT e.uuid, e.parentuuid
      FROM files_paths AS ep JOIN core_data AS e
        ON ep.id = e.parentuuid
  )
  SELECT id FROM files_paths
)

请注意,这是一个递归 CTE 查询。

如果我将 $query 替换为 SELECT 查询,所有代码都会正确运行(没有出现错误 1046)。

感谢任何帮助或想法。

9 月 13 日星期一编辑!!

在 MySQL 8 上测试的相同代码工作正常!刚刚删除了 MariaDB 并安装了 MySQL8,php 代码或 SQL 查询没有变化!这是 MariaDB 的问题吗?

这可能是 MariaDB 的问题。这就是我这么认为的原因:

*** 星球大战音乐启动 ***

*** 屏幕倾斜,文字向上滚动并显示... ***

10多年前,我写了一个答案给postProblem with MySQL subquery。在那个 post 中,有人问为什么对 table 的 DELETE 和针对相同 table 的子查询不起作用。我在 MySQL Internals Documentation 中找到了一些内容,它解释了如何以这样一种方式重写查询,即在处理行时键值实际上可以消失。在您的情况下,我推测由于转换导致的一个或多个丢失的键可能被错误地解释为“未选择数据库”。

如果您的查询在 MySQL 8.0 中运行良好,则表明 Oracle 可能实际上已经修复了此行为(或者至少得到了更好的处理)。请记住,MariaDB 是一个完全不同的代码库。

I have mentioned this crazy situation over the years in conjunction with doing DELETEs like this.

您可能需要执行以下两项操作之一:

  1. 升级到最新的 MariaDB(如果需要,提交错误报告)
  2. 坚持使用 MySQL 8.0