这是第三方产品,他们回答某些问题的速度很慢,而且我知道数据位于该数据库内部,所以我想做一些复古工程。
给定一个表,是否可以有该表的列名列表?
例如在SqlServer中,可以将表转储到可重用的
CREATE
语句中列出表组成的所有列。#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))
评论
您对数据库有什么样的访问权限?@dezso,它在单独的计算机上,但是我可以登录并使用管理员权限启动psql命令行
如果我对您的理解正确,那么您将在psql中使用\ dt [+] table_name。
不。 \ dt +似乎没有明确显示列名称。它只会添加一个“描述”字段。
但是\ d +表名有效!