我正在数据库中寻找我不了解的精确信息。

这是第三方产品,他们回答某些问题的速度很慢,而且我知道数据位于该数据库内部,所以我想做一些复古工程。

给定一个表,是否可以有该表的列名列表?

例如在SqlServer中,可以将表转储到可重用的CREATE语句中列出表组成的所有列。

评论

您对数据库有什么样的访问权限?

@dezso,它在单独的计算机上,但是我可以登录并使用管理员权限启动psql命令行

如果我对您的理解正确,那么您将在psql中使用\ dt [+] table_name。

不。 \ dt +似乎没有明确显示列名称。它只会添加一个“描述”字段。

但是\ d +表名有效!

#1 楼

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

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


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

评论


在psql中,使用\ x或\ pset扩展使查询结果线性(而不是表格格式),从而更易于阅读stackoverflow.com/a/9605093/513397

– anishpatel
17年7月7日在22:46

在当前版本中(在9.6中尝试过),您可以在psql \ d + public。*中进行操作,以获取公共模式中所有表和视图的描述(模式+ indeces / fkeys / triggers)。我们在预提交的钩子脚本中使用它来跟踪git每次提交对数据库所做的更改。

–塔利斯·K(Thalis K.)
17-10-23在18:30

SELECT column_name仅获取列名

–安德鲁(Andrew)
18年2月22日在16:56

#2 楼

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

select *
from table_name
where false;


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

评论


我想您的意思是将此SQL传递给psql命令。我建议在这种情况下使用--no-psqlrc选项,以避免输出出现意外情况。

– JohnMudd
17 Mar 9 '17 at 19:37

除了必须指定要选择的隐藏列(如pg_class.oid)

– okutane
19年2月19日在15:06

#3 楼

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

但是,信息模式中的视图通常会加入系统目录中的许多表中,以符合严格的标准化格式-其中许多只是空载,时间。这使它们变慢。
Postgres开发人员没有做出承诺,但基本知识(如此处所需的内容)在主要版本之间不会发生变化。

psql(本机命令-line接口)走快速通道,然后直接查询源。如果使用参数psql启动-E,则会显示反斜杠命令后面的SQL,例如\d。或从psql命令行\set ECHO_HIDDEN on。从那里开始,您可以构建问题的答案。


给定一个表,可以列出该表的列名称。 br />
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亲自看看。一次性查找仍然无关紧要。但是,如果在重复多次的查询/函数中使用,可能会有所不同。

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


如何检查表是否存在于给定架构中


评论


确实像您这样显示-E并向人们展示如何获取psql的sql。

–埃文·卡洛尔(Evan Carroll)
16年2月2日在20:31

我同意。我进行了一些速度测试,然后pg_catalog的运行速度快了2倍

–丹尼尔·范登博斯(Daniel L. VanDenBosch)
12月4日14:58

#4 楼


PostgreSQL 11+上的psql

如果要查询中的列类型,可以使用psql\gdesc

SELECT
    NULL AS zero,
    1 AS one,
    2.0 AS two,
    'three' AS three,
     AS four,
    sin() 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)


#5 楼

仅限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))