Psql列出所有表


125

我想liferay在我的PostgreSQL安装中列出数据库中的所有表。我怎么做?

我想SELECT * FROM applications;liferay数据库中执行。applications是我liferay数据库中的一个表。怎么做?

这是我所有数据库的列表:

postgres=# \list
                              List of databases
Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
 -----------+----------+----------+-------------+-------------+-----------------------
 liferay   | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =Tc/postgres         +
           |          |          |             |             | postgres=CTc/postgres+
           |          |          |             |             | liferay=CTc/postgres
 lportal   | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | 
 postgres  | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | 
 template0 | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(5 rows)

postgres=# 

Answers:


203

如果要列出所有表,则必须使用:

\dt *.*

表示您想要所有模式中的所有表。这将包括中的表pg_catalog,系统表以及中的表information_schema。没有内置的方式可以说“所有用户定义的模式中的所有表”。但是,您可以search_path在运行之前将您的列表设置为所有感兴趣的模式的列表\dt

您可能需要以编程方式执行此操作,在这种情况下,psql反斜杠命令将无法完成任务。这是INFORMATION_SCHEMA来救援。列出表:

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

顺便说一句,如果您想查看psql反斜杠命令在做什么,请运行psql-E标志。例如:

$ psql -E regress    
regress=# \list
********* QUERY **********
SELECT d.datname as "Name",
       pg_catalog.pg_get_userbyid(d.datdba) as "Owner",
       pg_catalog.pg_encoding_to_char(d.encoding) as "Encoding",
       d.datcollate as "Collate",
       d.datctype as "Ctype",
       pg_catalog.array_to_string(d.datacl, E'\n') AS "Access privileges"
FROM pg_catalog.pg_database d
ORDER BY 1;
**************************

因此您可以看到它psql正在pg_catalog.pg_database获取数据库列表时正在搜索。同样,对于给定数据库中的表:

SELECT n.nspname as "Schema",
  c.relname as "Name",
  CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' WHEN 'f' THEN 'foreign table' END as "Type",
  pg_catalog.pg_get_userbyid(c.relowner) as "Owner"
FROM pg_catalog.pg_class c
     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r','')
      AND n.nspname <> 'pg_catalog'
      AND n.nspname <> 'information_schema'
      AND n.nspname !~ '^pg_toast'
  AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1,2;

在可能的情况下,最好使用SQL标准的可移植INFORMATION_SCHEMA而不是Pg系统目录,但是有时您需要特定于Pg的信息。在这种情况下,可以直接查询系统目录psql -E这对如何进行查询很有帮助。


information_schema.tables出于某种原因包含视图。(在PostgreSQL 9.2,反正。)
jpmc26

@ jpmc26是的,带有table_type = 'VIEW',因此很容易排除它们。通常,SQL尝试尽可能将视图与表相同。
Craig Ringer 2014年

94

连接到数据库,然后列出表:

\c liferay
\dt

无论如何我就是这样。

如果愿意,可以将这两个命令合并到一行中:

\c liferay \dt

2
您实际上想要的\dt *.*不是所有感兴趣的表都在上search_path
Craig Ringer 2013年

10

要查看公共表格,您可以执行

列表表

\dt

列出表,视图和访问权限

\dp or \z

或只是表名

select table_name from information_schema.tables where table_schema = 'public';

2

在SQL查询中,您可以编写以下代码:

select table_name from information_schema.tables where table_schema='YOUR_TABLE_SCHEME';

用YOUR_TABLE_SCHEME替换您的表方案;

例:

select table_name from information_schema.tables where table_schema='eLearningProject';

要查看所有方案和所有表,不需要where子句:

select table_name from information_schema.tables

1

单行示例是

\dt schemaname.* 

在您的senario中

\dt public.*

0

如果不需要所有模式中的所有表,可以在自动化脚本中使用它:

  for table in $(psql -qAntc '\dt' | cut -d\| -f2); do
      ...
  done

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.