列出指定表的所有列

Ste*_*and 386 postgresql metadata information-schema catalogs

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

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

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

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

bha*_*mby 464

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

SELECT *
  FROM information_schema.columns
 WHERE table_schema = 'your_schema'
   AND table_name   = 'your_table'
     ;
Run Code Online (Sandbox Code Playgroud)

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

  • 添加“order by ordinal_position”以保留列顺序 (11认同)
  • 只是为了使复制粘贴到 psql 更容易:`SELECT column_name FROM information_schema.columns where table_name = 'TABLE_NAME'; ` (9认同)

Mik*_*ll' 114

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

select *
from table_name
where false;
Run Code Online (Sandbox Code Playgroud)

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

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

  • 除了必须指定才能选择的隐藏列(如 pg_class.oid) (2认同)

Erw*_*ter 84

信息模式是慢而稳的方式:它是标准化的,基本上可以移植到支持它的其他数据库。它将继续跨主要版本工作。

然而,信息模式中的视图通常会连接系统目录中的许多表以满足严格的标准化格式——其中许多在大多数情况下只是空运。这让他们变慢了
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;
Run Code Online (Sandbox Code Playgroud)

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

可见性也存在细微的差异。详细对比:


Eva*_*oll 10

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)
Run Code Online (Sandbox Code Playgroud)


oᴉɹ*_*ǝɥɔ 5

仅限 PostgreSQL

这有点矫枉过正,但如果您正在寻找尽可能短的 SQL,它可能是一个竞争者:

SELECT json_object_keys(to_json(json_populate_record(NULL::schema_name.table_name, '{}'::JSON)))
Run Code Online (Sandbox Code Playgroud)

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

SELECT json_object_keys(to_json((SELECT t FROM schema_name.table_name t LIMIT 1)))
Run Code Online (Sandbox Code Playgroud)

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

SELECT skeys(hstore(NULL::schema_name.table_name))
Run Code Online (Sandbox Code Playgroud)