在PostgreSQL模式中列出表

当我在psql中执行\dt时,我只获得当前模式中的表列表(默认为public)。

如何获得所有模式或特定模式中的所有表的列表?

485957 次浏览

你可以从information_schema中选择表

SELECT * FROM information_schema.tables
WHERE table_schema = 'public'

在所有模式中:

=> \dt *.*

在特定模式中:

=> \dt public.*

可以使用带有一些限制的正则表达式

\dt (public|s).(s|t)
List of relations
Schema | Name | Type  | Owner
--------+------+-------+-------
public | s    | table | cpn
public | t    | table | cpn
s      | t    | table | cpn

高级用户可以使用正则表达式符号,如字符类,例如[0-9]来匹配任何数字。所有正则表达式特殊字符都像9.7.3节中规定的那样工作,除了.被用作上面提到的分隔符,*被翻译成正则表达式符号.*?被翻译成.,以及$被逐字匹配。你可以在需要时通过为.编写?,为R*编写(R+|),为*1编写*0来模拟这些模式字符。$不需要作为正则表达式字符,因为模式必须匹配整个名称,这与正则表达式的通常解释不同(换句话说,$会自动添加到您的模式中)。如果你不希望模式被锚定,在开头和/或结尾写入*。注意,在双引号内,所有正则表达式的特殊字符将失去其特殊含义,并按字面进行匹配。此外,正则表达式的特殊字符在操作符名称模式中逐字匹配(即*5的参数)。

除了information_schema之外,还可以使用pg_tables:

select * from pg_tables where schemaname='public';

对于那些将来遇到这个问题的人:

如果你想查看几个模式的关系列表:

$psql mydatabase
mydatabase=# SET search_path TO public, usa;   #schema examples
SET
mydatabase=# \dt
List of relations
Schema |      Name       | Type  |  Owner
--------+-----------------+-------+----------
public | counties        | table | postgres
public | spatial_ref_sys | table | postgres
public | states          | table | postgres
public | us_cities       | table | postgres
usa    | census2010      | table | postgres

如果你对列出特定的模式中的所有表感兴趣,我发现这个答案相关:

SELECT table_schema||'.'||table_name AS full_rel_name
FROM information_schema.tables
WHERE table_schema = 'yourschemaname';