HOWTO · PostgreSQL

如何列出 PostgreSQL 中的所有資料表

透過查詢 INFORMATION_SCHEMA 檢視表或使用 psql 的資料表列表中繼命令,依 schema 篩選結果,列出 PostgreSQL 資料庫中的所有資料表。

本頁內容

要查看 PostgreSQL 資料庫中的每一個資料表,最快的方式是查詢 information_schema.tables 檢視表,或是在 psql 中執行 \dt 中繼命令。以下兩種做法都會介紹。

INFORMATION_SCHEMA 是每個 PostgreSQL 資料庫中都會自動存在的 schema。它透過 SQL 標準所定義的一組檢視表公開資料庫物件的中繼資料,因此 information_schema.tables 本身就是一個描述資料表與檢視表的檢視表,而不是儲存使用者資料的資料表。查詢它可以得知有哪些物件存在,以及每個物件屬於哪個 schema;但它不會賦予你對這些物件的 DROP 等權限。權限仍然來自 GRANT,而且這些檢視表只會回報目前角色被允許看到的物件。

本文中的陳述式是一般的 SQL 與 psql 命令,需要在你自己的資料庫工作階段中執行,因此以可複製的語法呈現,而非附上擷取的輸出結果。

使用 information_schema.tables 列出資料表

若要列出資料庫所知的每一個表格式物件,請執行:

SELECT * FROM information_schema.tables;

每個回傳的資料列各描述一個物件。實用的資料行包括 table_catalog(資料庫名稱)、table_schema(物件所在的 schema)、table_name,以及 table_type(一般資料表為 BASE TABLE,檢視表為 VIEW)。只需要名稱時,可以投影較少的資料行:

SELECT table_schema, table_name FROM information_schema.tables;

以下是結果外觀的節略範例:

table_catalog table_schema table_name table_type
postgres public customers BASE TABLE
postgres information_schema tables VIEW

請注意,單一查詢會回傳來自多個 schema 的資料列。table_schema 資料行會指出每個物件屬於哪個 schema,因此 public、pg_catalog 和 information_schema 的資料列才會並列出現。由於 INFORMATION_SCHEMA 遵循 SQL 標準(ISO/IEC 9075),同樣的查詢在其他資料庫系統上也能運作;而 pg_catalog 存放的是 PostgreSQL 自己的系統目錄資料表。

依 schema 篩選資料表

在 table_schema 上加上 WHERE 子句,即可將結果縮小到單一 schema。應用程式的資料表通常位於 public:

SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';

你可以替換成任何需要的 schema。例如,WHERE table_schema = 'information_schema' 會列出標準檢視表本身,而 'pg_catalog' 會列出系統目錄。由於 information_schema.tables 也會回報檢視表,當你只需要真正的資料表時,請再加上 table_type 篩選條件:

SELECT table_schema, table_name FROM information_schema.tables WHERE table_schema = 'public' AND table_type = 'BASE TABLE';

使用 psql 列出資料表

在 psql 互動式終端機中,\dt 中繼命令會印出精簡的資料表清單。不帶參數的 \dt 會顯示 search_path 上各 schema 中的資料表,通常只有 public。若要明確指定某一個 schema,請在模式中加上限定:

\dt public.*

若要一次查看所有 schema 中的資料表,請在兩個部分都使用萬用字元:

\dt *.*

結果是一個標題為 List of relations 的表格,包含 Schema、Name、Type 和 Owner 資料行(實際輸出的欄位標籤維持英文):

Schema Name Type Owner
public customers table postgres

請記住兩個限制。\dt 只會列出資料表,所以不會顯示 INFORMATION_SCHEMA 的內容——那些是檢視表:檢視表請使用 \dv information_schema.*,若要列出該 schema 中所有類型的關聯則使用 \d information_schema.*。此外,這些中繼命令只能在 psql 內使用;它們不是可以透過其他用戶端或驅動程式傳送的 SQL 陳述式。

瞭解 schema 與相關的 psql 命令

schema 是資料庫內的命名空間,因此不同的 schema 可以包含同名的資料表。這就是為什麼未篩選的清單會混合來自多個 schema 的資料列,也是閱讀結果時 table_schema 或 Schema 資料行很重要的原因。

看起來相似的命令其實用途不同,值得釐清:

  • \dt 列出資料表,而 \dv 列出檢視表。
  • \dn 列出 schema(命名空間)本身。\dn information_schema 會顯示該 schema 的項目,包括其擁有者——它不會列出資料表。
  • \z 等同於 \dp,會印出每個物件被授予的存取權限。它適合用來稽核權限,而不是列出資料表。請以反斜線輸入;若打成正斜線 /z 會產生錯誤。

根據這些區別可以歸納出實用的工作流程:使用 information_schema.tables 或 \dt 來列舉資料表,加上 table_schema 篩選條件或 schema 模式來縮小範圍;當需要的是 schema 或權限細節而非資料表清單時,再改用 \dn 或 \z。