PostgreSQL:在PostgreSQL中显示表


Answers:


2660

psql命令行界面中,

首先,选择您的数据库

\c database_name

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

\dt

以编程方式(psql当然也可以通过界面):

SELECT * FROM pg_catalog.pg_tables;

系统表位于pg_catalog数据库中。


102
@StephenCorwin不,在MySQL中\l等效show databasesdtshow tableslshow databases
user454322

12
\dt非常有用 该表pg_catalog.pg_tables要少得多,因为它似乎将内部表与用户创建的表一起聚集到碰巧要连接到的任何数据库。
aroth

33
psql my_db_name应该运行才能\dt正常工作。当我在psql没有数据库名称的情况下运行时,收到“未找到任何关系”消息
Maksim Dmitriev

31
没有系统表:SELECT * FROM pg_catalog.pg_tables WHERE schemaname != 'pg_catalog' AND schemaname != 'information_schema'
马特·怀特

39
您首先需要\c <DATABASE_NAME>选择数据库。
danio '16

200

以超级用户身份登录:

sudo -u postgres psql

您可以按\l命令列出所有数据库和用户(按列出其他命令\?)。

现在,如果您想查看其他数据库,则可以通过\c命令更改用户/数据库\c template1\c postgres postgres并使用\d\dt\dS查看表/视图/等。


1
这是一个更好的答案,因为通常可能安装了多个数据库。
Jerome

这非常有帮助。谢谢。
Promise Preston

123

(为了完整性)

您还可以查询(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 table仅显示当前模式,以这种方式来考虑它很不错,mysql只有一个数据库但有多个模式,其中postgresql可以具有多个数据库(目录)和模式。因此,等效值应该为table_schema ='DB_NAME';
拉希

不完全是标准的sql,不能使用“ ||” 串联mssql上的字符串
ChRoNoN

122

您可以使用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

52
  1. 首次以postgres用户身份登录:

    sudo su - postgres

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

  3. \dt 将返回您连接的数据库中所有表的列表。


40

使用-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;        
**************************

1
顺便说一句,TOAST用于存储较大的值:postgresql.org/docs/8.3/static/storage-toast.html
Dorian

39

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

sudo su - postgres

然后我们可以使用以下命令进入postgresql shell:

psql

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

\l

如果您还想检查数据库的大小,请使用:-

\l+

q返回。

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

\c database_name

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

\d

现在返回到外壳使用:

q

现在进一步查看特定表使用的详细信息:

\d table_name

要返回postgresql_shell,请按\q

然后返回终端exit


24

如果只想查看已创建的表的列表,则只能说:

\dt

但是,我们也PATTERN可以帮助您自定义要显示的表。要显示所有包括pg_catalog模式的内容,可以添加*

\dt *

如果您这样做: \?

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


23

使用只看一张桌子

=> \dt

如果要查看架构表

=>\dt+

如果您想查看特定的架构表

=>\dt schema_name.* 

我敢肯定你混淆+使用S。后者(字母)显示架构表。在+简单地显示额外的信息。
Garret Wilson

20

首先使用以下命令连接数据库

\c database_name

您将看到此消息- You are now connected to database database_name。然后他们运行以下命令

SELECT * FROM table_name;

在database_name和table_name中,只需使用您的数据库和表名进行更新


20
我不确定这是否在回答问题。我认为OP正在(正在)试图了解其数据库中的所有表,而不是从其数据库中的特定表中获取所有行...对吗?

16

如果您在PostgreSQL中使用pgAdmin4,则可以使用它来显示数据库中的表:

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

14

请注意,\dt仅此一项将列出您正在使用的数据库的公共模式中的表。我喜欢将表保留在单独的模式中,因此,可接受的答案对我不起作用。

要列出特定模式中的所有表,我需要:

1)连接到所需的数据库:

psql mydb

2)在\dt命令后指定要查看其表的架构名称,如下所示:

\dt myschema.*

这显示了我感兴趣的结果:

               List of relations
 Schema   |       Name      | Type  |  Owner   
----------+-----------------+-------+----------
 myschema | users           | table | postgres
 myschema | activity        | table | postgres
 myschema | roles           | table | postgres


8

\ dt(不需要*)-将列出您已经连接到的现有数据库的所有表。另外有用的注意事项:

\ d [table_name]-将显示给定表的所有列,包括类型信息,引用和键约束。


6

您可以使用以下命令列出当前数据库中的表 \dt

Fwiw \d tablename将显示有关给定表的详细信息,类似于show columns from tablenameMySQL中的信息,但有更多信息。


5

使用psql:\ dt

要么:

SELECT c.relname AS Tables_in FROM pg_catalog.pg_class c
        LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE pg_catalog.pg_table_is_visible(c.oid)
        AND c.relkind = 'r'
        AND relname NOT LIKE 'pg_%'
ORDER BY 1

3

首先,您必须像这样连接数据库

我的数据库是ubuntu

使用此命令进行连接

 \c ubuntu

此消息将显示

“您现在以用户“ postgres”连接到数据库“ ubuntu”。”

现在

运行此命令以显示其中的所有表

\d+

3

就我而言,在命令行中列出所有表的最直接方法是:

psql -a -U <user> -p <port> -h <server> -c "\dt"

对于给定的数据库,只需添加数据库名称:

psql -a -U <user> -p <port> -h <server> -c "\dt" <database_name>

它在Linux和Windows上均可使用。


3

作为一个快速的班轮

# just list all the postgres tables sorted in the terminal
db='my_db_name'
clear;psql -d $db -t -c '\dt'|cut -c 11-|perl -ne 's/^([a-z_0-9]*)( )(.*)/$1/; print'

或者,如果您希望使用更清晰的json输出多行代码:

IFS='' read -r -d '' sql_code <<"EOF_CODE"
    select array_to_json(array_agg(row_to_json(t))) from (
        SELECT table_catalog,table_schema,table_name 
        FROM information_schema.tables
        ORDER BY table_schema,table_name ) t
EOF_CODE
psql -d postgres -t -q -c "$sql_code"|jq

1

\ dt将列出表,并且“ \ pset pager off”将它们显示在同一窗口中,而无需切换到单独的窗口。喜欢在dbshel​​l中将其杀死。



0

首先,输入您需要连接的数据库

\c database_name

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

\dt

-2

首先,您可以使用Mac上的postgre.app或使用postico连接到postgres数据库。运行以下命令:

psql -h localhost -p port_number -d database_name -U user_name -W

然后输入密码,这应该可以访问您的数据库

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.