在PostgreSQL中查询表的模式细节?

7

我需要知道PostgreSQL中的列类型(例如varchar(20))。 我知道我可以在psql中使用\d来查找,但我需要通过select查询来完成。
在PostgreSQL中是否有可能做到这一点?

3个回答

11

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

SELECT pg_typeof(col)::text FROM tbl LIMIT 1
表格必须至少包含一行。当然,您仅获取没有类型修改器(如果有)的基本类型。如果您也需要它,请使用下面的替代方法。
您也可以将该函数用于常量。请参阅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()对象标识符类型(如regclass)的手册。


寻找“format_type(atttypid, atttypmod)”已经有一段时间了,因为它似乎与information_schema.columns.udt_name相同(或类似),这对我的情况来说完全可以。谢谢 :)。 - Dolfa

9
您可以使用以下查询语句在PostgreSQL中完整描述一个表格:
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命令。


非常好的回答!不过我又遇到了另一个问题:http://stackoverflow.com/questions/4336465/using-query-to-set-the-column-type-in-postgresql - David
2
我认为你不需要那个正则表达式匹配,c.relname ~ '^(TABLENAME)$' 等同于 c.relname = 'TABLENAME'。不过回答得很好。 - mu is too short
@mu 你说得对,但我想他只是从支持正则表达式的某个地方复制粘贴了这个 :) - Nick Barnes

2

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