如何使用Postgres information_schema列出自定义类型

67

我试图使用information_schema找到与\dT等效的SQL,但似乎找不到任何信息。这样的东西存在吗?

例如:如果我添加以下自定义类型枚举,如何在information_schema中查看它?

CREATE TYPE communication.channels AS ENUM
   ('text_message',
    'email',
    'phone_call',
    'broadcast');

注意:我已经拥有由 \dT 使用的确切 SQL(通过打开日志获取),但我特别寻找使用 information_schema 的更干净的实现。


如果您不想使用命令行,pgAdmin可以完成此操作。 - DrColossos
7个回答

78

供参考,这里是 \dT 的 SQL(pgAdmin 使用相同或类似的)

SELECT      n.nspname as schema, t.typname as type 
FROM        pg_type t 
LEFT JOIN   pg_catalog.pg_namespace n ON n.oid = t.typnamespace 
WHERE       (t.typrelid = 0 OR (SELECT c.relkind = 'c' FROM pg_catalog.pg_class c WHERE c.oid = t.typrelid)) 
AND     NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type el WHERE el.oid = t.typelem AND el.typarray = t.oid)
AND     n.nspname NOT IN ('pg_catalog', 'information_schema');

3
这段代码显示了所有类型的列表,包括用户定义的枚举类型,但不提供它们是如何定义的细节。 - Eliyahu Skoczylas

74

列出所有的数据库类型:

test=# \dT
             List of data types
 Schema |        Name         | Description
--------+---------------------+-------------
 public | gender              |
 public | status              |

列出所有的数据库类型及其相关信息,例如值:

<ul>
  <li>MySQL - 默认端口3306</li>
  <li>PostgreSQL - 默认端口5432</li>
  <li>Oracle - 默认端口1521</li>
  <li>SQL Server - 默认端口1433</li>
  <li>MongoDB - 默认端口27017</li>
</ul>

test=# \dT+
                                                   List of data types
 Schema |        Name         |    Internal name    | Size |     Elements      | Owner | Access privileges | Description
--------+---------------------+---------------------+------+-------------------+-------+-------------------+-------------
 public | gender              | gender              | 4    | male             +| Vadim |                   |
        |                     |                     |      | female            |       |                   |
 public | status              | status              | 4    | processing       +| Vadim |                   |
        |                     |                     |      | passed           +|       |                   |
        |                     |                     |      | failed            |       |                   |

获取特定类型及其附加信息:

leps=# \dT+ gender
                                            List of data types
 Schema |  Name  | Internal name | Size | Elements | Owner | Access privileges | Description
--------+------------+---------------+------+-------------------+-------+-------------------+-------------
 public | gender | gender        | 4    | male    +| Vadim |                   |
        |        |               |      | female  +|       |                   |

39

这是一种简单的方法,用于列出当前数据库中定义的所有枚举类型。查询结果返回两列,第一列显示每个枚举类型的名称,第二列显示每个枚举类型的每个值的名称:

 SELECT pg_type.typname AS enumtype, 
     pg_enum.enumlabel AS enumlabel
 FROM pg_type 
 JOIN pg_enum 
     ON pg_enum.enumtypid = pg_type.oid;

1
“AS enumlabel”这部分是多余的,你觉得呢? - Pere

14

您自己定义的所有类型列表:

\dT

testDB=> \dT
               List of data types
 Schema |          Name           | Description 
--------+-------------------------+-------------
 public | myType                  | 
(1 row)

11

枚举类型不在 SQL 标准中,因此在信息模式中没有对其进行表示。其他用户定义的类型通常会出现在视图 user_defined_types 中,但是该视图尚未实现。因此,目前您无法使用信息模式来列出 PostgreSQL 中的用户定义类型。


17
请取消此回答的奖励,并将其改为“列出所有数据库类型”\dT - WestCoastProjects

6

我使用一个视图来显示我的枚举名称。该视图的数据可以被用于应用程序中,以提供枚举字段的可用选项列表。

CREATE OR REPLACE VIEW vw_enums AS
SELECT t.typname, e.enumlabel, e.enumsortorder
FROM pg_enum e
JOIN pg_type t ON e.enumtypid = t.oid;

0

很不幸,pg_enum目录只包含枚举标签,而没有模式或其他任何内容。因此,您仍然需要进行连接以获取有意义的数据。 - Collin Peters

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