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.
您可能需要执行以下两项操作之一:
- 升级到最新的 MariaDB(如果需要,提交错误报告)
- 坚持使用 MySQL 8.0
我有一个 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.
您可能需要执行以下两项操作之一:
- 升级到最新的 MariaDB(如果需要,提交错误报告)
- 坚持使用 MySQL 8.0