【问题标题】:How to get a list column names and datatypes of a table in PostgreSQL?如何在 PostgreSQL 中获取表的列表列名和数据类型?
【发布时间】:2013-12-10 06:45:18
【问题描述】:

如何使用查询获取 PostgreSQL 中表的列名和数据类型列表?

【问题讨论】:

  • plsql \gdesc 也是一个选项。简洁的功能是它可以描述整个查询(对复杂的临时查询很有用),但它也适用于简化场景SELECT * FROM tab_name \gdesc

标签: sql postgresql sqldatatypes


【解决方案1】:

打开psql命令行并输入:

\d+ table_name

【讨论】:

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

通过上述查询,您可以列及其数据类型

【讨论】:

  • 这不会为用户定义的类型提供正确的答案(例如,由 ogr2ogr 创建的几何和地理列,其格式为 geometry(Geometry,[SRID]))。
  • 也可以使用table_catalog = 'my_database'table_schema = 'my_schema',以便仅从特定数据库的特定模式的特定表中获取列。
  • 如果您希望在此代码上构建,我可以向大家建议。使用pg_catalog 而不是information_schemainformation_schema 有一些非常简单和通用的 SQL,但是它比较慢,因为它级别更高。
【解决方案3】:
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)
        );

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

【讨论】:

  • 有效,但你为什么使用c.relname ~ '^(hello world)$ 而不是简单的c.relname = 'hello world'
【解决方案4】:

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

SELECT column_name, data_type 
FROM information_schema.columns
WHERE table_name = 'your_table_name' AND table_schema = 'your_schema_name';

或使用 psql:

\d+ your_schema_name.your_table_name

【讨论】:

    【解决方案5】:

    支持在特定模式中查找表的列名和类型的版本,并使用不带任何子查询的 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;
    

    【讨论】:

    • 这是我最喜欢的答案,因为它完成了两件事。它使用pg_catalog 并强制您指定架构。如果您在公共模式中塞满所有东西,我个人认为这是一个糟糕的策略。随着项目的发展,将很难保持井井有条。恕我直言
    【解决方案6】:

    更新了 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'
        );
    

    【讨论】:

      【解决方案7】:
      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';
      

      【讨论】:

      • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
      【解决方案8】:

      为了让这个话题“更完整”。

      我需要 SELECT 语句(不是表)上的列名和数据类型。

      如果您想在 SELECT 语句而不是实际存在的表上执行此操作,您可以执行以下操作:

      DROP TABLE IF EXISTS abc;
      CREATE TEMPORARY TABLE abc AS
      -- your select statement here!
      SELECT 
          *
      FROM foo
      -- end your select statement
      ;
      
      select column_name, data_type 
      from information_schema.columns 
      where table_name = 'abc';
      DROP IF EXISTS abc;
      

      简短的解释,它为您的 select 语句创建一个(临时)表,您可以通过(以及其他)@a_horse_with_no_name 和 @selva 提供的查询“调用”该表。

      希望这会有所帮助。

      【讨论】:

        【解决方案9】:
         --how to get a list column names and datatypes of a table in PostgreSQL?
        
        
            SELECT DISTINCT
                ROW_NUMBER () OVER (ORDER BY pgc.relname , a.attnum) as rowid , 
                pgc.relname as table_name ,
                a.attnum as attr,
                a.attname as name,
                format_type(a.atttypid, a.atttypmod) as typ,
                a.attnotnull as notnull, 
                com.description as comment,
                coalesce(i.indisprimary,false) as primary_key,
                def.adsrc as default
            FROM pg_attribute a 
            JOIN pg_class pgc ON pgc.oid = a.attrelid
            LEFT JOIN pg_index i ON 
                (pgc.oid = i.indrelid AND i.indkey[0] = a.attnum)
            LEFT JOIN pg_description com on 
                (pgc.oid = com.objoid AND a.attnum = com.objsubid)
            LEFT JOIN pg_attrdef def ON 
                (a.attrelid = def.adrelid AND a.attnum = def.adnum)
            LEFT JOIN pg_catalog.pg_namespace n ON n.oid = pgc.relnamespace
        
            WHERE 1=1 
                AND pgc.relkind IN ('r','')
                AND n.nspname <> 'pg_catalog'
                AND n.nspname <> 'information_schema'
                AND n.nspname !~ '^pg_toast'
        
            AND a.attnum > 0 AND pgc.oid = a.attrelid
            AND pg_table_is_visible(pgc.oid)
            AND NOT a.attisdropped
            ORDER BY rowid
            ;
        

        【讨论】:

        • 请在您的代码中包含上下文。另外,如何将其扩展到其他模式?
        【解决方案10】:

        无需提及架构,您也可以获得所需的详细信息 试试这个查询->

        选择列名,数据类型 来自 information_schema.columns 其中 table_name = 'table_name';

        【讨论】:

          【解决方案11】:

          我一直在寻找一种方法,可以直接从 pgAdmin 4 获取具有不带 PSQL cl 的数据类型的列名,并找到了一种解决方法。添加更多选项:

          右键单击所需的数据库 > 生成 ERD(Beta) > 生成 SQL(或 Alt+Ctrl+S),pgAdmin 4 将打开查询编辑器,您可以在其中找到所有具有列名和数据类型的表:

          【讨论】:

            【解决方案12】:

            下面将列出提供的架构名称中所有表的所有不同数据类型。

            \copy (select distinct data_type, column_name from information_schema.columns where table_name in (SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname != 'pg_catalog' AND schemaname != 'information_schema' and schemaname = '<Your schema name>')) to 'datatypes.csv'  delimiter as ',' CSV header
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2016-05-31
              • 1970-01-01
              • 1970-01-01
              • 2015-05-10
              • 2011-11-02
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多