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

时间:2010-09-07 16:52:13

标签: sql postgresql

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

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

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

注意:我确实拥有\ dT使用的确切SQL(通过打开日志记录检索)但我正在寻找使用information_schema的更清晰的实现

7 个答案:

答案 0 :(得分:42)

作为参考,这里是来自\ 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')

答案 1 :(得分:17)

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

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

答案 2 :(得分:8)

枚举不在SQL标准中,因此未在信息架构中表示。其他用户定义的类型通常位于视图user_defined_types中,但未实现。所以目前,您无法使用信息模式在PostgreSQL中列出用户定义的类型。

答案 3 :(得分:8)

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

\dT

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

答案 4 :(得分:8)

列出所有数据库类型:

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

列出所有数据库类型以及值:

等附加信息
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  +|       |                   |

答案 5 :(得分:3)

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

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;

答案 6 :(得分:0)

看看这里:http://www.postgresql.org/docs/current/static/catalog-pg-enum.html

pg_enum目录应该包含您正在查找的数据