如何在PostgreSQL中显示表格?

2433
在PostgreSQL中,与MySQL中的show tables相对应的是什么?

请参见 https://dba.stackexchange.com/a/1288/90651 - Peter Krauss
32个回答

3467

psql 命令行界面开始,

首先,选择你的数据库

\c database_name

然后,这将显示当前模式中的所有表:

\dt

以编程方式(或者当然也可以通过 psql 接口):

SELECT * FROM pg_catalog.pg_tables;

系统表存放在 pg_catalog 数据库中。


128
@StephenCorwin 不是,\l 相当于 MySQL 中的 show databasesdtshow tables lshow databases - user454322
17
\dt非常有用。而pg_catalog.pg_tables则不太实用,因为它似乎将内部表和用户创建的表混在一起,无论您连接到哪个数据库。 - aroth
35
要使\dt命令生效,需要在运行psql my_db_name。当我没有指定数据库名称运行psql时,会出现“未找到关系”的错误提示。 - Maksim Dmitriev
47
没有系统表:SELECT * FROM pg_catalog.pg_tables WHERE schemaname != 'pg_catalog' AND schemaname != 'information_schema' - Matt White
47
首先需要使用\c <数据库名>来选择你的数据库。 - danio
显示剩余10条评论

225

以超级用户身份登录:

sudo -u postgres psql

你可以使用 \l 命令列出所有数据库和用户,(通过 \? 列出其他命令)。

现在,如果你想查看其他数据库,可以使用 \c 命令更改用户/数据库,例如:\c template1\c postgres postgres,然后使用 \d\dt 或者 \dS 查看表/视图等。


223
你可以使用PostgreSQL的交互式终端Psql来显示PostgreSQL中的表。 1. 启动Psql 通常,你可以运行以下命令进入psql:
psql DBNAME USERNAME
例如,psql template1 postgres 可能会遇到的一种情况是:假设您以root身份登录,但忘记了数据库名称。您可以通过运行以下命令首先进入Psql:
sudo -u postgres psql
在某些系统中,可能没有sudo命令可用,您可以选择运行以下任一命令:
psql -U postgres
psql --username=postgres

2. 显示表格

现在在Psql中,您可以运行以下命令:

  1. \? 列出所有命令
  2. \l 列出数据库
  3. \conninfo 显示当前连接的信息
  4. \c [DBNAME] 连接到新的数据库,例如,\c template1
  5. \dt 列出公共模式的表格
  6. \dt <schema-name>.* 列出特定模式的表格,例如,\dt public.*
  7. \dt *.* 列出所有模式的表格
  8. 然后您可以运行SQL语句,例如,SELECT * FROM my_table;(注意:语句必须以分号;结尾)
  9. \q 退出psql

"psql -U postgres" 将记录并连接到 "postgres" 数据库。 - Bhanu Tez
\d+ 表示表格的详细信息。 \x 以展开的方式显示输出。(重新输入 \x 可以关闭展开显示) - Dheeraj Yandrapu
@sina \du与列出表格无关,这是问题所询问的内容。这里没有列出所有的psql命令。 - Bergi
@sina \du与列出表格无关,这是问题所询问的内容。这里没有列出所有的psql命令。 - undefined
啊,将分号 ; 添加到查询中确实起作用了!谢谢。 - Bobby Koteski

164

为了完整性起见

您还可以查询(SQL标准的)信息模式

SELECT
    table_schema || '.' || table_name
FROM
    information_schema.tables
WHERE
    table_type = 'BASE TABLE'
AND
    table_schema NOT IN ('pg_catalog', 'information_schema');

3
+1 虽然为了完整性,MySQL 的 show tables 命令只显示当前模式(schema)的表,但可以这样理解:MySQL 只有一个数据库,但有多个模式;而 PostgreSQL 可以有多个数据库(目录)和模式。因此,等价于 MySQL 的语句应该是 table_schema='DB_NAME'。 - Rahly
不是标准的 SQL,在 MSSQL 上不能使用 "||" 来连接字符串。 - ChRoNoN
6
@ChRoNoN:那是标准的SQL。自1983年以来,||一直是SQL标准中的字符串连接运算符 - 只有MS SQL使用了非标准的字符串连接运算符。 - user330315

56

以超级用户身份登录,以便您可以检查所有数据库及其模式:

sudo su - postgres

通过以下命令,我们可以进入PostgreSQL shell:

psql

现在,您可以使用以下命令查看所有数据库列表:

\l

如果您想检查数据库大小,请使用以下命令:

\l+

按下q返回。

找到数据库后,您现在可以使用以下命令连接到该数据库:

\c database_name

连接成功后,您可以通过以下方式检查数据库表或模式:

\d

现在要返回到shell,请使用:-

q

现在要进一步查看某个表的详细信息,请使用:

\d table_name

回到 postgresql_shell,输入 \q

返回终端,请输入 exit


3
对于不熟悉pgsql的人来说,这是一个不错的快速入门指南。 - Bastion

56
  1. 首先以postgres用户身份登录:

    sudo su - postgres

  2. 连接到需要的数据库:psql -d databaseName

  3. \dt 返回当前连接的数据库中所有表格的列表。


44

使用 -E 标志运行 psql 将回显用于实现 \dt 等命令的内部查询:

sudo -u postgres psql -E

postgres=# \dt       
********* QUERY **********
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' 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;        
**************************

2
顺便提一下,TOAST 用于存储大值:http://www.postgresql.org/docs/8.3/static/storage-toast.html - Dorian

26
如果你只想查看你创建的表的列表,只需输入以下命令:
\dt

但是我们还有PATTERN选项可以帮助您自定义要显示哪些表。为了显示所有包括pg_catalog模式下的表,你可以添加*
\dt * 如果你输入:\?

\dt[S+] [PATTERN] 列出表格


26

只能看到表格

=> \dt

如果想要查看模式表

=>\dt+

如果你想查看特定的模式表

=>\dt schema_name.* 

我非常确定你把 +S 混淆了。后者(字母)显示模式表,而 + 只是显示额外信息。 - Garret Wilson

22

(MySQL) 显示当前数据库的数据表列表

show tables;

(PostgreSQL) 显示当前数据库的表列表

select * from pg_catalog.pg_tables where schemaname='public';

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,