PostgreSQL “DESCRIBE TABLE”

1854

Como você executa o equivalente ao Oracle DESCRIBE TABLEno PostgreSQL (usando o comando psql)?

Mr. Muskrat
fonte

Respostas:

2820

Tente isso (na psqlferramenta de linha de comando):

\d+ tablename

Veja o manual para mais informações.

Chris Bunch
fonte
8
Originalmente, eu havia aceitado a resposta de devinmoore, mas eu realmente gosto mais dessa. Não apenas descreve a tabela, mas também mostra os metadados, como descrições de colunas e se existem OIDs.
Sr. Muskrat
27
A +é realmente embreagem, como PostgresSQL 9 só dá a descrição detalhada para vistas quando o fizer \d+ table_name, ao invés do simples\d table_name
nessur
12
\ d não funciona quando você o invoca no PosgreSQL 9.1 através do pgAdmin, a resposta de Vinko abaixo é aplicável a mais casos
hello_earth
12
psql -Eé útil para obter o sql que implementos \d+e similares (para uso fora do psql prompt)
bsb
17
Erro: "não encontrou nenhuma relação denominada". Isso significa que você precisa colocar o nome da sua tabela entre aspas duplas. Aparentemente, o postgres vai minúscula o nome da sua tabela sem eles e, portanto, não encontra a sua tabela. Espero que isso ajude qualquer pessoa que venha aqui e tenha esse problema. :)
amurrell
742

Além da maneira do PostgreSQL (\ d 'something' ou \ dt 'table' ou \ ds 'sequence' e assim por diante)

A maneira padrão do SQL, como mostrado aqui :

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

É suportado por muitos mecanismos de banco de dados.

Vinko Vrsalovic
fonte
23
selecione column_name, data_type, character_maximum_length de INFORMATION_SCHEMA.COLUMNS em que table_name = 'table';
Dr. Person Person II
7
Isso é mais útil do que \ d quando você está preso a um servidor pré-8.4 psql e um servidor pós-8.4 - o comando \ d é incompatível.
beldaz
26
Além disso, este comando é executado no RedShift, onde \d+não. Esta é a melhor resposta IMO
New Alexandria
6
Maravilhoso, altought para postgres eu acrescentaria o nome do esquema também
ffflabs
3
Isso lista apenas colunas com informações mínimas. \ d + fornece DDL completo para a tabela, incluindo: padrões, nulidade, nextval, precisão, chave primária, chaves estrangeiras, índices, restrições de verificação e FKs de outras tabelas.
precisa saber é
70

Se você deseja obtê-lo da consulta em vez do psql, pode consultar o esquema do catálogo. Aqui está uma consulta complexa que faz isso:

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
;

É bastante complexo, mas mostra o poder e a flexibilidade do catálogo do sistema PostgreSQL e deve levá-lo a caminho do domínio pg_catalog ;-). Certifique-se de alterar os% s na consulta. O primeiro é o esquema e o segundo é o nome da tabela.

Gavin M. Roy
fonte
3
Esta consulta é melhor mostrada aqui, observe que eles sugerem "\ d table" também
Flavien Volken 12/11/11
3
Uma vantagem desta solução é que format_type()incluirá qualquer modificador anexado ao tipo, por exemplo numeric(6,2); enquanto information_schema.columnsque apenas informará o tipo base de numeric.
Eli Collins
3
Como faço para dividir o tipo de dados do tamanho? diga | caracteres variados (50) | para 2 colunas: | caractere variando | 50
Ivanceras 20/05
51

Você pode fazer isso com um comando psql slash:

 \d myTable describe table

Também funciona para outros objetos:

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

Fonte: faqs.org

devinmoore
fonte
36

O equivalente psql de DESCRIBE TABLEé \d table.

Veja a parte psql do manual do PostgreSQL para mais detalhes.

Mr. Muskrat
fonte
2
Além disso, a seleção de banco de dados psql é \c databasenamemais que use databasename(para aqueles que vêm do MySQL como eu :-). Sem \c databasenameprimeiro, \d tablenameproduz No relations found.mensagem e nada mais.
Ville
27

Esta deve ser a solução:

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

Você pode fazer um \d *search pattern * asterisco para encontrar tabelas que correspondam ao padrão de pesquisa em que você está interessado.

Ryan
fonte
Era isso que eu estava procurando - como descrever um subconjunto de tabelas. De notar, também descobri que, se suas tabelas tiverem maiúsculas, a sintaxe é \d *"<SubString>"*. Ou seja, as aspas duplas devem estar dentro dos asteriscos. Embora, se você quiser apenas a lista de tabelas, então você quer usar\dt
Randall
este seqüências e índices de jogos, bem como tabelas
15

Além da linha de comando que \d+ <table_name>você já encontrou, você também pode usar o esquema de informações para procurar os dados da coluna, usando info_schema.columns

SELECT *
FROM info_schema.columns
WHERE table_schema = 'your_schema'
AND table_name   = 'your_table'
Mushahid Khan
fonte
9
FROM info_schema.columnsnão funcionou para mim, eu tive que usar from information_schema.columns, não tenho certeza se isso é um erro de digitação na sua resposta ou algum problema de implementação ao final.
user27874
14

Use a seguinte instrução SQL

SELECT DATA_TYPE 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE table_name = 'tbl_name' 
AND COLUMN_NAME = 'col_name'

Se você substituir tbl_name e col_name, ele exibirá o tipo de dados da coluna específica que você está procurando.

Mr.Tananki
fonte
3
É o que diz esta resposta de 2008.
Quentin
@ Quentin-Há diferença entre os dois. A solução acima de 2008 descreve o nome da coluna, o tipo de dados, o comprimento_máximo do caractere para toda a tabela. Onde como o meu - a solução mencionada - mostra apenas o tipo de dados da coluna do esquema. Execute os dois e verifique. Ambos são diferentes. Todas as soluções aqui são maneiras diferentes de resolver um problema. O usuário pode usar isso por razões diferentes
Mr.Tananki
14

Você pode usar isto:

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

No MySQL , DESCRIBE table_name


No PostgreSQL , \ d nome_tabela


Ou, você pode usar este comando longo:

SELECT
        a.attname AS Field,
        t.typname || '(' || a.atttypmod || ')' AS Type,
        CASE WHEN a.attnotnull = 't' THEN 'YES' ELSE 'NO' END AS Null,
        CASE WHEN r.contype = 'p' THEN 'PRI' ELSE '' END AS Key,
        (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid), '\'(.*)\'')
                FROM
                        pg_catalog.pg_attrdef d
                WHERE
                        d.adrelid = a.attrelid
                        AND d.adnum = a.attnum
                        AND a.atthasdef) AS Default,
        '' as Extras
FROM
        pg_class c 
        JOIN pg_attribute a ON a.attrelid = c.oid
        JOIN pg_type t ON a.atttypid = t.oid
        LEFT JOIN pg_catalog.pg_constraint r ON c.oid = r.conrelid 
                AND r.conname = a.attname
WHERE
        c.relname = 'tablename'
        AND a.attnum > 0

ORDER BY a.attnum
MisterJoyson
fonte
7

Para melhorar a consulta SQL da outra resposta (o que é ótimo!), Aqui está uma consulta revisada. Também inclui nomes de restrições, informações sobre herança e tipos de dados divididos em suas partes constituintes (tipo, comprimento, precisão, escala). Ele também filtra as colunas que foram eliminadas (que ainda existem no banco de dados).

SELECT
    n.nspname as schema,
    c.relname as table,
    f.attname as column,  
    f.attnum as column_id,  
    f.attnotnull as not_null,
    f.attislocal not_inherited,
    f.attinhcount inheritance_count,
    pg_catalog.format_type(f.atttypid,f.atttypmod) AS data_type_full,
    t.typname AS data_type_name,
    CASE  
        WHEN f.atttypmod >= 0 AND t.typname <> 'numeric'THEN (f.atttypmod - 4) --first 4 bytes are for storing actual length of data
    END AS data_type_length, 
    CASE  
        WHEN t.typname = 'numeric' THEN (((f.atttypmod - 4) >> 16) & 65535)
    END AS numeric_precision,   
    CASE  
        WHEN t.typname = 'numeric' THEN ((f.atttypmod - 4)& 65535 )
    END AS numeric_scale,       
    CASE  
        WHEN p.contype = 'p' THEN 't'  
        ELSE 'f'  
    END AS is_primary_key,  
    CASE
        WHEN p.contype = 'p' THEN p.conname
    END AS primary_key_name,
    CASE  
        WHEN p.contype = 'u' THEN 't'  
        ELSE 'f'
    END AS is_unique_key,
    CASE
        WHEN p.contype = 'u' THEN p.conname
    END AS unique_key_name,
    CASE
        WHEN p.contype = 'f' THEN 't'
        ELSE 'f'
    END AS is_foreign_key,
    CASE
        WHEN p.contype = 'f' THEN p.conname
    END AS foreignkey_name,
    CASE
        WHEN p.contype = 'f' THEN p.confkey
    END AS foreign_key_columnid,
    CASE
        WHEN p.contype = 'f' THEN g.relname
    END AS foreign_key_table,
    CASE
        WHEN p.contype = 'f' THEN p.conkey
    END AS foreign_key_local_column_id,
    CASE
        WHEN f.atthasdef = 't' THEN d.adsrc
    END AS default_value
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 f.attisdropped = false
    AND n.nspname = '%s'  -- Replace with Schema name  
    AND c.relname = '%s'  -- Replace with table name  
    AND f.attnum > 0 
ORDER BY f.attnum
;
Howard Elton
fonte
4

Você também pode verificar usando a consulta abaixo

Select * from schema_name.table_name limit 0;

Exemplo: Minha tabela possui 2 colunas, nome e senha. Dando screenshot abaixo.

Adicionando imagem

* Usando PG admin3

Riya Bansal
fonte
porque a seleção e esperando o pgadmin para pegar a folga de obter os dados de meta não é "melhor prática"
Mickey Perlstein
2

A melhor maneira de descrever uma tabela, como uma coluna, tipo, modificadores de colunas, etc.

\d+ tablename or \d tablename
Guardião
fonte
1
Use this command 

\d table name

like 

\d queuerecords

             Table "public.queuerecords"
  Column   |            Type             | Modifiers
-----------+-----------------------------+-----------
 id        | uuid                        | not null
 endtime   | timestamp without time zone |
 payload   | text                        |
 queueid   | text                        |
 starttime | timestamp without time zone |
 status    | text                        |
Usman Yaqoob
fonte
1
In postgres \d is used to describe the table structure.
e.g. \d schema_name.table_name;
this command will provide you the basic info of table such as, columns, type and modifiers.

If you want more info about table use
\d+ schema_name.table_name;
this will give you extra info such as, storage, stats target and description
meenal
fonte
0

1) PostgreSQL DESCRIBE TABLE usando psql

Na ferramenta de linha de comando psql, \ d nome_tabela ou \ d + nome_tabela para encontrar as informações nas colunas de uma tabela

2) PostgreSQL DESCRIBE TABLE usando information_schema

Instrução SELECT para consultar o nome da coluna, o tipo de dados e o comprimento máximo de caracteres da tabela de colunas no banco de dados information_schema;

SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH de INFORMATION_SCHEMA.COLUMNS em que table_name = 'tablename';

Para mais informações https://www.postgresqltutorial.com/postgresql-describe-table/

SumiSujith
fonte
-1

/ dt é o nômade que lista todas as tabelas presentes em um banco de dados. Usando o
comando / d e / d +, podemos obter os detalhes de uma tabela. O sysntax será como
* / d nome_tabela (ou) \ d + nome_tabela

Pavan Teja
fonte
-3

Eu trabalhei no seguinte script para obter o esquema da tabela.

'CREATE TABLE ' || 'yourschema.yourtable' || E'\n(\n' ||
array_to_string(
array_agg(
'    ' || column_expr
)
, E',\n'
) || E'\n);\n'
from
(
SELECT '    ' || column_name || ' ' || data_type || 
coalesce('(' || character_maximum_length || ')', '') || 
case when is_nullable = 'YES' then ' NULL' else ' NOT NULL' end as column_expr
FROM information_schema.columns
WHERE table_schema || '.' || table_name = 'yourschema.yourtable'
ORDER BY ordinal_position
) column_list;
paulg
fonte
||parece ser algo como um operador de concatenação (juntando cordas juntos)