我正在数据库中寻找我不了解的精确信息。
这是第三方产品,他们回答某些问题的速度很慢,而且我知道数据位于该数据库内部,所以我想做一些复古工程。
给定一个表,是否可以列出该表的列名?
例如,在SqlServer中,可以将表转储到可重用的CREATE
语句中,该语句以文本形式列出表所组成的所有列。
\dt[+] table_name
中psql
。
我正在数据库中寻找我不了解的精确信息。
这是第三方产品,他们回答某些问题的速度很慢,而且我知道数据位于该数据库内部,所以我想做一些复古工程。
给定一个表,是否可以列出该表的列名?
例如,在SqlServer中,可以将表转储到可重用的CREATE
语句中,该语句以文本形式列出表所组成的所有列。
\dt[+] table_name
中psql
。
Answers:
除了\d+ <table_name>
已经找到的命令行之外,还可以使用Information Schema通过以下命令来查找列数据information_schema.columns
:
SELECT *
FROM information_schema.columns
WHERE table_schema = 'your_schema'
AND table_name = 'your_table'
;
注意:按照上面的示例,请确保将值括在引号中。
\d+ public.*
以获取模式中所有表和视图的描述(模式+ indeces / fkeys / triggers)public
。我们在预提交的钩子脚本中使用它来跟踪git每次提交对数据库所做的更改。
该信息模式是慢而稳的方式:它是标准化的,基本上可以移植到支持它的其他数据库。而且它将在主要版本之间继续工作。
但是,信息模式中的视图通常会加入系统目录中的许多表中,以符合严格标准化的格式-大多数情况下,其中许多只是空载。这使它们变慢。
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
自己看看。一次性查找仍然无关紧要。但是,如果在多次重复的查询/函数中使用,可能会有所不同。
可见性也有细微的差异。详细比较:
-E
展示并向人们展示如何获取psql的sql。
psql
在PostgreSQL 11+上如果要查找查询的列类型,则可以使用psql
的\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)
仅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))