【问题标题】:Undefined table: 7 ERROR: relation "V5TableName" does not exist未定义的表:7 错误:关系“V5TableName”不存在
【发布时间】:2020-04-22 18:36:02
【问题描述】:

我正在为我的应用程序使用 MVC 框架 (Zend),我想在 PostgreSQL 中找到一个表的总大小(包括索引)。表名是 "V5TableName" - 包括引号,因为表名区分大小写。我已确保不涉及任何拼写错误。

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

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;
}

当我的应用程序调用此函数时,它会在我的日志中返回以下错误:

[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 中运行相同的查询,它返回表大小(例如:104Mb)非常好。

我试过了:

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

以上方法似乎都不起作用。我不确定这里出了什么问题。

我还尝试在我的应用程序中查找总数据库大小(数据库名称: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

我想知道是否有类似的方法可以找到表格大小。

【问题讨论】:

    标签: php postgresql zend-framework zend-db pgadmin-4


    【解决方案1】:

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

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

    首先确保您连接到正确的数据库集群(也称为“服务器”)。它由其数据目录定义,或者由主机名和端口号同样明确。阅读手册herehere

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

    SELECT current_database();
    

    然后检查正确的表和架构名称

    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 中使用双引号标识符。它让您的生活更轻松。

    【讨论】:

    • 谢谢欧文。这更像是一个 Zend 问题,而不是 Postgres 问题。数据库名称也是 MyDbName。
    • @als10:数据库集群没有名称。数据库可以。连接时必须选择数据库。
    猜你喜欢
    • 2017-04-14
    • 1970-01-01
    • 2021-12-20
    • 2020-01-03
    • 2014-10-24
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多