AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
主页 / dba / 问题 / 22362
Accepted
Stephane Rolland
Stephane Rolland
Asked: 2012-08-14 04:44:44 +0800 CST2012-08-14 04:44:44 +0800 CST 2012-08-14 04:44:44 +0800 CST

列出指定表的所有列

  • 772

我正在数据库中寻找我不知道的精确信息。数据库在单独的机器上,但我可以登录到它,并psql以管理员权限启动命令行。

这是第三方产品,他们回答问题的速度很慢。我知道数据在那个数据库中,所以我想做一些逆向工程。

给定一个表名,是否可以获得该表中列名的列表?

例如,在 SQL Server 中,可以将表转储到可重用的CREATE语句中,该语句以文本形式列出组成该表的所有列。

postgresql metadata
  • 5 5 个回答
  • 891070 Views

5 个回答

  • Voted
  1. Best Answer
    bhamby
    2012-08-14T05:27:53+08:002012-08-14T05:27:53+08:00

    除了\d+ <table_name>您已经找到的命令行之外,您还可以使用Information Schema来查找列数据,使用information_schema.columns:

    SELECT *
      FROM information_schema.columns
     WHERE table_schema = 'your_schema'
       AND table_name   = 'your_table'
         ;
    

    注意:根据上面的示例,请确保将值括在引号内。

    • 551
  2. Mike Sherrill 'Cat Recall'
    2012-08-14T23:13:19+08:002012-08-14T23:13:19+08:00

    作为其他答案的补充,即使是不返回任何行的 SELECT 语句也会向您和应用程序代码公开列名。

    select *
    from table_name
    where false;
    

    我打算让几乎所有 DBMS 的几乎所有客户端软件都可以执行此操作。(几乎?是的,有些不支持像这样的子句where false。相反,它们需要像这样的表达式where 1 = 0。)

    权限可能会与这些方法中的任何一种一起发挥作用。

    • 137
  3. Erwin Brandstetter
    2012-08-14T15:05:19+08:002012-08-14T15:05:19+08:00

    信息模式是一种缓慢而可靠的方式:它是标准化的,并且很大程度上可移植到支持它的其他数据库。它将继续在主要版本中工作。

    但是,信息模式中的视图通常会连接系统目录中的许多表以满足严格标准化的格式——其中许多大部分时间只是空运。这让他们变慢了。
    Postgres 开发人员没有做出承诺,但基础知识(比如这里需要什么)不会在主要版本之间发生变化。

    更详细的评估:

    • 查询以输出查询、表或视图的名称和数据类型

    psql(本机命令行界面)当然走快车道,直接查询源代码。如果psql以参数-E\d开头,则会显示反斜杠命令后面的 SQL 。或者\set ECHO_HIDDEN on从 psql 命令行。从那里开始,您可以为您的问题建立答案。

    给定一个表,是否有可能拥有该表的列名列表。

    SELECT attrelid::regclass AS tbl
         , attname            AS col
         , atttypid::regtype  AS datatype
           -- more attributes?
    FROM   pg_attribute
    WHERE  attrelid = 'myschema.mytable'::regclass  -- table name optionally schema-qualified
    AND    attnum > 0
    AND    NOT attisdropped
    ORDER  BY attnum;
    

    比查询information_schema.columns更快。试着EXPLAIN ANALYZE亲眼看看。对于一次性查找来说仍然无关紧要。但是如果在重复多次的查询/函数中使用可能会有所不同。

    可见度也有细微差别。详细对比:

    • 如何检查给定模式中是否存在表
    • 89
  4. Evan Carroll
    2018-07-07T11:08:40+08:002018-07-07T11:08:40+08:00

    psql在 PostgreSQL 11+

    如果您正在查找查询中的列类型,您可以使用psql's\gdesc

    SELECT
        NULL AS zero,
        1 AS one,
        2.0 AS two,
        'three' AS three,
        $1 AS four,
        sin($2) as five,
        'foo'::varchar(4) as six,
        CURRENT_DATE AS now
    \gdesc
     Column |         Type         
    --------+----------------------
     zero   | text
     one    | integer
     two    | numeric
     three  | text
     four   | text
     five   | double precision
     six    | character varying(4)
     now    | date
    (8 rows)
    
    • 12
  5. oᴉɹǝɥɔ
    2019-09-05T11:26:14+08:002019-09-05T11:26:14+08:00

    仅限 PostgreSQL

    这有点做作,但如果您正在寻找最短的 SQL,这可能是一个竞争者:

    SELECT json_object_keys(to_json(json_populate_record(NULL::schema_name.table_name, '{}'::JSON)))
    

    甚至更短(假设表中至少存在一行)

    SELECT json_object_keys(to_json((SELECT t FROM schema_name.table_name t LIMIT 1)))
    

    列表保留顺序。如果您不关心订单并hstore安装了扩展程序,您可以做得更短

    SELECT skeys(hstore(NULL::schema_name.table_name))
    
    • 8

相关问题

  • 我可以在使用数据库后激活 PITR 吗?

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 199037
  • 回答 263511
  • 最佳答案 131755
  • 用户 66345
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve