是否有方法显示用户定义的postgresql枚举类型定义?
假设我们定义了一个postgresql类型:是否有方法显示用户定义的postgresql枚举类型定义?,postgresql,enums,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_类型表似乎没有提供足够的信息 SELECT t.typname FROM pg_class c JOIN pg_attribute a ON c.oid =
CREATE TYPE my_type AS ENUM('foo', 'bar');
有没有办法在创建后显示类型定义
我希望“\d my_type”会显示“ENUM('foo','bar')”,但它说:
Did not find any relation named "my_type"
pg_类型表似乎没有提供足够的信息
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。这是\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)
如果您只需要全名(类型名称和架构)和所有
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\u agg()
需要Postgres 9.0或更高版本,对于较旧版本,替换为array\u agg()
要获取SQL
CREATE
语句,可以使用pg_dump
并查看转储文件
或者,更实际地说,使用它为数据库中的任何对象显示反向工程SQL创建脚本。在对象浏览器
中选择它,其创建脚本将显示在SQL窗格
中。甚至有一个选项可以将脚本自动复制到新打开的SQL编辑器的窗口中,您可以在该窗口中编辑和执行脚本。检查以下内容:
select enum_range(null::my_type)
我认为这是一个简单得多的解决方案:)。我不理解“您使用\dD作为域”的相关性。域和类型是不同的。域使用\dD,类型使用\dT。好的,我明白了。“域本质上是一种具有可选约束的数据类型(对允许的值集的限制)。”我花了一点时间才意识到我真正想要的是\dT+my_enum
。请注意,默认情况下,您需要在pgAdmin
中启用查看类型:文件→ 选择权→ 浏览并检查类型
。实际上,从1.18.1版开始,您可以在文件->选项->显示中找到该选项。我喜欢这个选项,因为它简单。最高评级的作品无论如何。。。但这一个也有。:)我喜欢这个。\d语法在dbeaver或pgadmin中不起作用,但portableWorks中的纯SQL在PostgreSQL 8.3.11中起作用。如果我的表名为users
,列名为status
,枚举类型为enum\u user\u status
,我应该键入什么而不是null:my\u type
?我尝试了我能想到的所有组合,但一无所获。@exebook我迟到了,但我使用了null::enum\u user\u status
(显然我使用了我的enum名称而不是enum\u user\u status
)。未涉及枚举所用的表/列。