繁体   English   中英

未定义表:7 错误:关系“V5TableName”不存在

[英]Undefined table: 7 ERROR: relation “V5TableName” does not exist

我正在为我的应用程序使用 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;
}

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

 [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

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

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

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

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

然后确保您连接到该数据库集群中的正确数据库 一个 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'));

请注意细微差别(如手册中所述):

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM