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。