簡體   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