题 PostgreSQL“DESCRIBE TABLE”


你如何执行相当于Oracle的 DESCRIBE TABLE 在PostgreSQL中(使用psql命令)?


1482
2017-09-20 20:47


起源




答案:


试试这个(在 psql 命令行工具):

\d+ tablename

看到 手册 了解更多信息。


2278
2017-09-20 20:50



我最初接受了devinmoore的答案,但我真的很喜欢这个。它不仅描述了表,还显示了诸如列描述之类的元数据以及是否存在任何OID。 - Mr. Muskrat
该 + 真的是离合器,因为PostgresSQL 9只会在你做的时候对视图进行深入的描述 \d+ table_name而不是简单 \d table_name - nessur
当你通过pgAdmin在PosgreSQL 9.1中调用它时,\ d不起作用,Vinko的答案适用于更多案例 - hello_earth
psql -E 获得实现的sql很方便 \d+ 和类似的(在psql提示符之外使用) - bsb
错误:“未找到任何名为”的关系。这意味着您需要将表的名称用双引号括起来。显然,postgres会在没有它们的情况下小写你的表名,因此找不到你的表。希望这可以帮助其他任何人来到这里并遇到这个问题。 :) - amurrell


除了PostgreSQL方式(\ d'thing'或\ dt'table'或\ ds'sequence'等等)

SQL标准方式,如图所示 这里

select column_name, data_type, character_maximum_length
from INFORMATION_SCHEMA.COLUMNS where table_name = '<name of table>';

它受到许多数据库引擎的支持。


571
2017-09-20 20:51



从INFORMATION_SCHEMA.COLUMNS中选择column_name,data_type,character_maximum_length,其中table_name ='table'; - Dr. Person Person II
当你遇到8.4之前的psql和8.4之后的服务器时,这比\ d更有用 - \ d命令是不兼容的。 - beldaz
此命令也针对RedShift运行 \d+ 才不是。 这是IMO的最佳答案 - New Alexandria
精彩,对于postgres我也会添加模式名称 - amenadiel
\ d,\ d +从Navicat不起作用。这个小问题足够好了!这应该是答案! - Kumar Vaibhav


如果要从查询而不是psql获取它,可以查询目录模式。这是一个执行该操作的复杂查询:

SELECT  
    f.attnum AS number,  
    f.attname AS name,  
    f.attnum,  
    f.attnotnull AS notnull,  
    pg_catalog.format_type(f.atttypid,f.atttypmod) AS type,  
    CASE  
        WHEN p.contype = 'p' THEN 't'  
        ELSE 'f'  
    END AS primarykey,  
    CASE  
        WHEN p.contype = 'u' THEN 't'  
        ELSE 'f'
    END AS uniquekey,
    CASE
        WHEN p.contype = 'f' THEN g.relname
    END AS foreignkey,
    CASE
        WHEN p.contype = 'f' THEN p.confkey
    END AS foreignkey_fieldnum,
    CASE
        WHEN p.contype = 'f' THEN g.relname
    END AS foreignkey,
    CASE
        WHEN p.contype = 'f' THEN p.conkey
    END AS foreignkey_connnum,
    CASE
        WHEN f.atthasdef = 't' THEN d.adsrc
    END AS default
FROM pg_attribute f  
    JOIN pg_class c ON c.oid = f.attrelid  
    JOIN pg_type t ON t.oid = f.atttypid  
    LEFT JOIN pg_attrdef d ON d.adrelid = c.oid AND d.adnum = f.attnum  
    LEFT JOIN pg_namespace n ON n.oid = c.relnamespace  
    LEFT JOIN pg_constraint p ON p.conrelid = c.oid AND f.attnum = ANY (p.conkey)  
    LEFT JOIN pg_class AS g ON p.confrelid = g.oid  
WHERE c.relkind = 'r'::char  
    AND n.nspname = '%s'  -- Replace with Schema name  
    AND c.relname = '%s'  -- Replace with table name  
    AND f.attnum > 0 ORDER BY number
;

它非常复杂,但它确实向您展示了PostgreSQL系统目录的强大功能和灵活性,并且可以帮助您实现pg_catalog掌握;-)。请务必更改查询中的%s。第一个是Schema,第二个是表名。


53
2017-09-22 23:39



此查询更好地显示 这里 请注意,他们也建议“\ d table” - Flavien Volken
该解决方案的一个优点是 format_type()将包括附加到该类型的任何修饰符,例如 numeric(6,2);而 information_schema.columns 只报告基本类型 numeric。 - Eli Collins
如何从大小中分割数据类型?说|性格变化(50)|到2列:|性格变化| 50 | - ivanceras


您可以使用psql斜杠命令执行此操作:

 \d myTable describe table

它也适用于其他对象:

 \d myView describe view
 \d myIndex describe index
 \d mySequence describe sequence

资源: faqs.org


45
2017-09-20 20:49





psql相当于 DESCRIBE TABLE 是 \d table

有关更多详细信息,请参阅PostgreSQL手册的psql部分。


31
2017-09-20 20:49



另外,psql数据库选择是 \c databasename 而不是 use databasename (对于像我这样来自MySQL的人:-)。没有 \c databasename 第一, \d tablename 产生 No relations found. 消息,仅此而已。 - Ville


你可以做一个 \d *search pattern *  用星号 查找与您感兴趣的搜索模式匹配的表格。


20
2018-05-30 16:20



这就是我想要的 - 如何描述一个 子集 的表格。值得注意的是,我还发现,如果您的表具有大写,则语法为 \d *"<SubString>"*。也就是说,双引号必须是 内 星号。但是,如果你只是想要的话 名单 然后你要使用的表格 \dt - Randall
这匹配序列和索引以及表 - easl


除了命令行 \d+ <table_name> 你已经找到了,你也可以使用 信息架构 使用查找列数据 info_schema.columns 

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

12
2018-02-25 08:03



FROM info_schema.columns 不适合我,我不得不使用 from information_schema.columns,不确定这是你答案中的错字还是我最后的实施问题。 - user27874


你可以用这个:

SELECT attname 
FROM pg_attribute,pg_class 
WHERE attrelid=pg_class.oid 
AND relname='TableName' 
AND attstattarget <>0; 

11
2017-12-05 18:55



这也适用于临时表。 - Manu CJ