查询PostgreSQL中表的架构细节?

时间:2010-12-02 14:51:25

标签: postgresql types dynamic-sql information-schema

我需要知道PostgreSQL中的列类型(即varchar(20))。我知道我可能在psql中使用\d找到了这个,但是我需要用select查询来完成它。
这在PostgreSQL中是否可行?

3 个答案:

答案 0 :(得分:11)

在PostgreSQL中有一种更简单的方式来获取列的类型。

SELECT pg_typeof(col)::text FROM tbl LIMIT 1

当然,该表必须至少保留一行。并且您只获得没有类型修饰符(如果有)的基本类型。如果您需要,也可以使用下面的替代方案 您也可以将该函数用于常量。 manual on pg_typeof()

对于空(或任何)表,您可以使用查询系统目录pg_attribute按顺序获取列的完整列表及其各自的类型:

SELECT attnum, attname AS column, format_type(atttypid, atttypmod) AS type
FROM   pg_attribute
WHERE  attrelid = 'myschema.mytbl'::regclass   -- optionally schema-qualified
AND    NOT attisdropped
AND    attnum > 0
ORDER  BY attnum;

format_type()object identifier types上的手册,如regclass

答案 1 :(得分:9)

您可以使用postgres使用以下查询完整描述表:

SELECT
  a.attname as Column,
  pg_catalog.format_type(a.atttypid, a.atttypmod) as Datatype
  FROM
  pg_catalog.pg_attribute a
  WHERE
    a.attnum > 0
  AND NOT a.attisdropped
  AND a.attrelid = (
    SELECT c.oid
    FROM pg_catalog.pg_class c
    LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
    WHERE c.relname ~ '^(TABLENAME)$'
   AND pg_catalog.pg_table_is_visible(c.oid)
  )

通过此操作,您将检索列名和数据类型。

也可以使用-E选项

启动psql客户端
$ psql -E

然后一个简单的\d mytable将输出postgres用来描述表的查询。它适用于每个psql describe命令。

答案 2 :(得分:2)

是的,请查看information_schema