有没有一种方法可以显示用户定义的postgresql枚举类型定义?


76

假设我们已经定义了一个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表似乎没有提供足够的信息。

Answers:


97

\ 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
我不了解“您将\ dD用于域”的相关性。
Faheem Mitha 2013年

2
域和类型是不同的东西。您将\ dD用于域,将\ dT用于类型。
理查德·赫克斯顿

4
好的我明白了。“域本质上是具有可选约束(对允许的值集的约束)的数据类型。”
Faheem Mitha 2013年

17
我花了一点时间才意识到我真正想要的是\dT+ my_enum;
gylaz

104

检查一下:

select enum_range(null::my_type)

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


1
我喜欢它的简单性。收视率最高的作品一定可以奏效...但是这也是。:)
PRS

我喜欢这一个。\ d语法在dbeaver或pgadmin中不起作用,但是纯SQL在可移植性中
Darren

在PostgreSQL 8.3.11中工作
Yzmir Ramirez

null:my_type如果我的表被调用users并且列status和枚举类型为,我应该键入什么而不是enum_user_status?我尝试了所有可以想到的组合,但一无所获。
exebook '19

@exebook我来晚了,但是我用了null::enum_user_status(很明显,我用了我的枚举名而不是enum_user_status)。枚举所使用的表/列不涉及。
dano

13

如果只需要全名(类型名称和架构)以及所有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()为旧版本。


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

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


2
请注意,您需要pgAdmin默认启用以下查看类型:文件→选项→浏览器并检查Types
Eugene Yarmash 2015年

实际上从1.18.1版开始,您可以在文件->选项->显示中找到该选项。
Mohamad mehdi Kharatizadeh 2015年

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。

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.