Como você executa o equivalente ao Oracle DESCRIBE TABLE
no PostgreSQL (usando o comando psql)?
Como você executa o equivalente ao Oracle DESCRIBE TABLE
no PostgreSQL (usando o comando psql)?
Respostas:
Tente isso (na psql
ferramenta de linha de comando):
\d+ tablename
Veja o manual para mais informações.
+
é 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
psql -E
é útil para obter o sql que implementos \d+
e similares (para uso fora do psql prompt)
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.
\d+
não. Esta é a melhor resposta IMO
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.
format_type()
incluirá qualquer modificador anexado ao tipo, por exemplo numeric(6,2)
; enquanto information_schema.columns
que apenas informará o tipo base de numeric
.
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
O equivalente psql de DESCRIBE TABLE
é \d table
.
Veja a parte psql do manual do PostgreSQL para mais detalhes.
\c databasename
mais que use databasename
(para aqueles que vêm do MySQL como eu :-). Sem \c databasename
primeiro, \d tablename
produz No relations found.
mensagem e nada mais.
Você pode fazer um \d *search pattern *
asterisco para encontrar tabelas que correspondam ao padrão de pesquisa em que você está interessado.
\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
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'
FROM info_schema.columns
nã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.
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.
Essa variação da consulta (conforme explicado em outras respostas) funcionou para mim.
SELECT
COLUMN_NAME
FROM
information_schema.COLUMNS
WHERE
TABLE_NAME = 'city';
É descrito aqui em detalhes: http://www.postgresqltutorial.com/postgresql-describe-table/
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
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
;
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.
* Usando PG admin3
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 |
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
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/
/ 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
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;