有没有办法显示用户定义的postgresql枚举类型定义?

时间:2012-03-02 15:31:51

标签: postgresql enums

假设我们已经定义了postgresql类型:

CREATE TYPE my_type AS ENUM('foo', 'bar');

有没有办法在创建后显示类型定义?

我希望“\ d my_type”能够显示“ENUM('foo','bar')”,但它说:

Did not find any relation named "my_type"

pg_type表似乎没有提供足够的信息。

4 个答案:

答案 0 :(得分:75)

这是\ dT你在追求,但它没有把它作为“CREATE”声明。您将\ dD用于域。

\dT+ action.action_status
                          List of data types
 Schema |         Name         | Internal name | Size | Elements | Description 
--------+----------------------+---------------+------+----------+-------------
 action | action.action_status | action_status | 4    | pending +| 
        |                      |               |      | live    +| 
        |                      |               |      | done    +| 
        |                      |               |      | notdone  | 
(1 row)

答案 1 :(得分:73)

检查一下:

select enum_range(null::my_type)

我认为这是一个更简单的解决方案:)。

答案 2 :(得分:12)

如果您只想要全名(类型名称和架构)以及所有enum标签的排序列表,则此查询将执行以下操作:

SELECT n.nspname AS "schema", t.typname
     , string_agg(e.enumlabel, '|' ORDER BY e.enumsortorder) AS enum_labels
FROM   pg_catalog.pg_type t 
JOIN   pg_catalog.pg_namespace n ON n.oid = t.typnamespace 
JOIN   pg_catalog.pg_enum e ON t.oid = e.enumtypid  
WHERE  t.typname = 'my_enum_type'
GROUP  BY 1,2;

返回:

 schema | typname      | enum_labels
--------+--------------+-------------
 public | my_enum_type | foo|bar

string_agg()需要Postgres 9.0或更高版本,旧版本替换为array_agg()


要获取SQL CREATE语句,可以使用pg_dump并查看转储文件。

或者更实际地,使用pgAdmin为数据库中的任何对象显示反向工程SQL创建脚本。在object browser中选择它,其创建脚本显示在SQL pane中。甚至可以选择将脚本自动复制到SQL editor新打开的窗口,您可以在其中编辑和执行它。

答案 3 :(得分:1)

SELECT t.typname
FROM pg_class c JOIN pg_attribute a ON c.oid = a.attrelid JOIN pg_type t ON a.atttypid = t.oid
WHERE c.relname = 'your_type';

棘手的部分是,只需从这些视图中选择*,就不会在结果中获得OID。