如何列出指定表格的所有列


158

我正在查找数据库中的一条精确信息,这是我不了解的。

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

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

例如,在SQLSERVER,有可能倾倒的表到一个可重用CREATE声明,该文本上列出了所有的表是由列。

  0

你有什么样的访问数据库? 13 8月. 122012-08-13 12:49:57

  0

@dezso,它是在一个单独的机器上,但我可以登录到它,并启动psql命令行,具有管理员权限 13 8月. 122012-08-13 12:54:37

+4

如果我正确理解你,你在'psql'中的'\ dt [+] table_name'之后。 13 8月. 122012-08-13 13:03:09

+1

不。 \ dt +似乎并没有明确显示列名。它只添加一个“描述”字段。 13 8月. 122012-08-13 13:16:51

+7

但\ d +表名的作品! 13 8月. 122012-08-13 13:18:12

197

除了命令行\d+ <table_name>你已经发现了,你也可以使用Information Schema查找列数据,使用information_schema.columns

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

注:根据上面的例子,确保值用引号括起来。

  0

在psql中,使用'\ x on'或'\ pset expanded on'来使查询结果成为线性(而不是表格式),因此更易于阅读https://stackoverflow.com/a/9605093/513397 07 9月. 172017-09-07 22:46:06

+1

在当前版本(在9.6中试过),你可以在psql'\ d + public。*'中完成''public''模式中所有表和视图的描述(schema + indeces/fkeys/triggers)。我们在预先提交的钩子脚本中使用它来跟踪每次提交所做的DB更改的git。 23 10月. 172017-10-23 18:30:47

+1

SELECT column_name只能获得列名 22 2月. 182018-02-22 16:56:14


54

information schema是一个缓慢而可靠的方式:它是标准化的,并且很大程度上可移植到支持它的其他数据库。它将继续在主要版本上运行。

然而,意见在信息模式经常参加从system catalogs许多表,以满足严格的标准格式 - 其中许多是刚死的货运的大部分时间。这使得他们缓慢
Postgres的开发人员并未做出承诺,但基本要素(如此处需要的)不会在主要版本中发生变化。

psql(本地命令行界面)当然需要快速通道,并直接查询源代码。如果您启动psql with the parameter -E,将显示如\d后面的反斜杠命令后面的SQL。或从psql命令行输入\set ECHO_HIDDEN on。从那里开始,你可以为你的问题建立一个答案。

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

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; 
querying information_schema.columns更快

。尝试EXPLAIN ANALYZE亲身体验。对于一次性查找来说,这仍然不重要。但是,如果用在多次重复的查询/函数中,可能会有所帮助。

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

+1

真的很喜欢你向你展示'-E'并向人们展示如何获得psql的sql。 02 12月. 162016-12-02 20:31:40


52

为补充其他的答案,甚至没有返回的行会暴露列名对您和应用程序代码的SELECT语句。

select * 
from table_name 
where false; 

权限可能会发挥任何这些方法。

  0

快速简单。最好的答案,如果我只需要看到列的列表。 26 1月. 172017-01-26 18:23:54

  0

我认为你的意思是将这个SQL传递给psql命令。我建议在这种情况下使用--no-psqlrc选项来避免输出中的意外。 09 3月. 172017-03-09 19:37:28

  0

最好,快速和简单 04 12月. 172017-12-04 10:31:13

  0

这是天才! 01 2月. 182018-02-01 10:07:26