Undefined table: 7 ERROR: relation "V5TableName" does not exist

Undefined table: 7 ERROR: relation "V5TableName" does not exist

我正在为我的应用程序使用 MVC 框架 (Zend),我想在 PostgreSQL 中找到 table 的总大小(包括索引)。 table 名称是 "V5TableName" - 包含引号是因为 table 名称区分大小写。我已经确保没有错别字。

我获取 table 大小的代码如下所示:

public function getMyTableSize()
{
  $sql = "SELECT pg_size_pretty(pg_total_relation_size( '\"V5TableName\"' ) );";

  /* Custom_Db is a custom library in my application which makes the PostgreSQL connection 
     and queries the database
   */
  $tableSize = Custom_Db::query($sql)->fetchColumn(); 

  return $tableSize;
}

当我的应用程序调用此函数时 returns 我的日志中出现以下错误:

[22-Apr-2020 09:42:37] PID:30849 ERR: SQLSTATE[42P01]: Undefined table: 7 ERROR:  relation "V5TableName" does not exist
LINE 1: SELECT pg_size_pretty(pg_total_relation_size( '"V5TableName...
                                                      ^
query was: SELECT pg_size_pretty(pg_total_relation_size( '"V5TableName"' ) );

如果我 运行 在 pgAdmin4 中使用相同的查询,它可以很好地返回 table 大小(例如:104Mb)。

我试过:

  1. 在代码中为 table 名称删除和添加引号。
  2. 将架构作为前缀附加到 table 名称(示例:'public."V5TableName"')。

NONE 以上似乎有效。我不确定这里出了什么问题。

我还尝试在我的应用程序中查找总数据库大小(数据库名称:MyDbName - 大小写混合拼写),我的查询如下所示:

$sql = "SELECT pg_size_pretty(pg_database_size('MyDbName'))"; // this DID NOT WORK

所以我将其更改为如下所示:(有效)

$sql = "SELECT pg_size_pretty(pg_database_size( current_database() ))"; // this WORKED

我想知道是否有类似的方法可以找到 table 尺寸。

您的查询应该有效。双引号的使用似乎是正确的。

SELECT pg_size_pretty(pg_total_relation_size('"V5TableName"'));

首先确保您连接到正确的数据库集群 (a.k.a。"server")。它由其数据目录定义,或者同样由主机名和端口号定义。阅读手册 here and here

然后确保您连接到该数据库集群中正确的数据库。一个 Postgres 数据库集群由 1-n 个数据库组成。在未指定实际数据库的情况下进行连接时,默认情况下您最终会进入名为 postgres 的维护数据库。这是最有可能的解释。检查:

SELECT current_database();

然后检查权限table和架构名称:

SELECT * FROM pg_tables
WHERE tablename ~* 'V5TableName';  -- ~* matches case-insensitive

至此第一个谜题应该解开了。

检查您的数据库拼写和可能的近似重复:

SELECT datname FROM pg_database;

调用 没有 双引号(就像您尝试正确一样),但需要正确的大写:

SELECT pg_size_pretty(pg_database_size('MyDbName'));

注意细微差别(如文档所述in the manual):

  • pg_database_size()oidname。因此传递区分大小写的数据库名称 不带双引号.
  • pg_total_relation_size() 占用 regclass。因此,如果需要保留大写,请传递区分大小写的关系名称 和双引号

pg_database_size() 必须有所不同,因为数据库没有专用的对象标识符类型 (no regdatabase)。

要点:尽可能避免在 Postgres 中使用双引号标识符。它让您的生活更轻松。