如何在PostgreSQL中获取表的列列名和数据类型?

Pra*_*tik 50 sql postgresql sqldatatypes

通过以下查询,我们可以获得PostgreSQL中表的列名和数据类型列表.

小智 81

打开psql commande行并输入:

\d+ table_name
Run Code Online (Sandbox Code Playgroud)

  • 这是不完整的,因为OP可能希望在SQL代码中以编程方式执行此操作,而不仅仅是通过psql. (9认同)
  • Postgres 以编程方式执行此操作,因此只需使用“-E”标志启动 postgres:“psql -E”,并且对于每个反斜杠命令,相应的 SQL 将显示在命令结果之前。 (4认同)
  • 我不明白为什么这不是最受欢迎的答案。 (3认同)
  • 假设 OP 可以访问“psql”,这个答案就有点超出范围了。拥有 postgres 并不意味着熟练或能够访问“psql”。 (2认同)

小智 69

select column_name,data_type 
from information_schema.columns 
where table_name = 'table_name';
Run Code Online (Sandbox Code Playgroud)

使用上面的查询,您可以使用列及其数据类型

  • 这不会为用户定义的类型提供正确的答案(例如,由*ogr2ogr*创建的几何和地理列,其形式为`geometry(Geometry,[SRID])`). (2认同)
  • 还可以使用 `table_catalog = 'my_database'` 和 `table_schema = 'my_schema'` 来仅从特定数据库的特定模式的特定表中获取列。 (2认同)
  • 如果您希望在此代码的基础上进行构建,我可以向大家建议。使用“pg_catalog”而不是“information_schema”。“information_schema”有一些非常简单且通用的 SQL,但是它的速度较慢,因为它的级别更高。 (2认同)
  • @MarcoMannes 或 `table_schema = current_schema()`。对于 postgres,“information_schema”仅包含当前数据库的数据,因此您不必担心这一点。 (2认同)

Pra*_*tik 14

SELECT
        a.attname as "Column",
        pg_catalog.format_type(a.atttypid, a.atttypmod) as "Datatype"
    FROM
        pg_catalog.pg_attribute a
    WHERE
        a.attnum > 0
        AND NOT a.attisdropped
        AND a.attrelid = (
            SELECT c.oid
            FROM pg_catalog.pg_class c
                LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
            WHERE c.relname ~ '^(hello world)$'
                AND pg_catalog.pg_table_is_visible(c.oid)
        );
Run Code Online (Sandbox Code Playgroud)

使用您的表名更改hello world

更多信息:http://www.postgresql.org/docs/9.3/static/catalog-pg-attribute.html

  • 有效,但为什么你使用 `c.relname ~ '^(hello world)$` 而不是简单的 `c.relname = 'hello world'`? (2认同)

Mic*_*mza 12

支持在特定模式中查找表的列名和类型的版本,并使用没有任何子查询的 JOIN

SELECT
    pg_attribute.attname AS column_name,
    pg_catalog.format_type(pg_attribute.atttypid, pg_attribute.atttypmod) AS data_type
FROM
    pg_catalog.pg_attribute
INNER JOIN
    pg_catalog.pg_class ON pg_class.oid = pg_attribute.attrelid
INNER JOIN
    pg_catalog.pg_namespace ON pg_namespace.oid = pg_class.relnamespace
WHERE
    pg_attribute.attnum > 0
    AND NOT pg_attribute.attisdropped
    AND pg_namespace.nspname = 'my_schema'
    AND pg_class.relname = 'my_table'
ORDER BY
    attnum ASC;
Run Code Online (Sandbox Code Playgroud)

  • 这是我最喜欢的答案,因为它完成了两件事。它使用“pg_catalog”并强制您指定模式。如果你把所有东西都塞进公共模式中,我个人认为这是一个糟糕的策略。随着项目的增长,将很难让事情井井有条。恕我直言 (3认同)

Hon*_*hař 7

更新了 Pratik 答案以支持更多模式和可空值:

SELECT
    "pg_attribute".attname                                                    as "Column",
    pg_catalog.format_type("pg_attribute".atttypid, "pg_attribute".atttypmod) as "Datatype",

    not("pg_attribute".attnotnull) AS "Nullable"
FROM
    pg_catalog.pg_attribute "pg_attribute"
WHERE
    "pg_attribute".attnum > 0
    AND NOT "pg_attribute".attisdropped
    AND "pg_attribute".attrelid = (
        SELECT "pg_class".oid
        FROM pg_catalog.pg_class "pg_class"
            LEFT JOIN pg_catalog.pg_namespace "pg_namespace" ON "pg_namespace".oid = "pg_class".relnamespace
        WHERE
            "pg_namespace".nspname = 'schema'
            AND "pg_class".relname = 'table'
    );
Run Code Online (Sandbox Code Playgroud)


Bat*_*Cat 7

如果您有多个具有相同表名的架构,请不要忘记添加架构名称。

SELECT column_name, data_type 
FROM information_schema.columns
WHERE table_name = 'your_table_name' AND table_schema = 'your_schema_name';
Run Code Online (Sandbox Code Playgroud)

或使用psql:

\d+ your_schema_name.your_table_name
Run Code Online (Sandbox Code Playgroud)


Sur*_*hti 6

SELECT column_name,data_type 
FROM information_schema.columns 
WHERE
table_name = 'your_table_name' 
AND table_catalog = 'your_database_name' 
AND table_schema = 'your_schema_name';
Run Code Online (Sandbox Code Playgroud)