PostgreSQL "DESCRIBE TABLE"

Respuestas:

2820

Pruebe esto (en la psqlherramienta de línea de comandos):

\d+ tablename

Vea el manual para más información.

Chris Bunch
fuente
8
Originalmente había aceptado la respuesta de devinmoore pero realmente me gusta más esta. No solo describe la tabla, sino que también muestra los metadatos, como las descripciones de las columnas y si hay algún OID.
Sr. Muskrat
27
El +es realmente embrague, como PostgreSQL 9 sólo se da la descripción en profundidad de puntos de vista cuando lo hace \d+ table_name, en lugar de la sencilla\d table_name
nessur
12
\ d no funciona cuando lo invocas en PosgreSQL 9.1 a través de pgAdmin, la respuesta de Vinko a continuación es aplicable a más casos
hello_earth
12
psql -Ees útil para obtener el sql que implementa \d+y similar (para usar fuera del indicador psql)
bsb
17
Error: "no se encontró ninguna relación llamada". Esto significa que debe incluir el nombre de su tabla entre comillas dobles. Aparentemente, postgres reducirá el nombre de su tabla en minúsculas sin ellos y, por lo tanto, no encontrará su tabla. Espero que esto ayude a cualquiera que venga aquí y tenga este problema. :)
amurrell
742

Además de la forma PostgreSQL (\ d 'algo' o \ dt 'tabla' o \ ds 'secuencia' y así sucesivamente)

La forma estándar de SQL, como se muestra aquí :

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

Es compatible con muchos motores db.

Vinko Vrsalovic
fuente
23
seleccione column_name, data_type, character_maximum_length de INFORMATION_SCHEMA.COLUMNS donde table_name = 'table';
Dr. Person Person II
77
Esto es más útil que \ d cuando estás atascado con un psql anterior a 8.4 y un servidor posterior a 8.4; el comando \ d es incompatible.
beldaz
26
También este comando se ejecuta contra RedShift, donde \d+no lo hace. Esta es la mejor respuesta OMI
Nueva Alejandría
66
Maravilloso, pensado para postgres, también agregaría el nombre del esquema
ffflabs
3
Esto solo enumera columnas con información mínima. \ d + proporciona DDL completo para la tabla que incluye: valores predeterminados, nulabilidad, nextval, precisión, clave primaria, claves externas, índices, restricciones de verificación y FK de otras tablas.
bradw2k
70

Si desea obtenerlo de la consulta en lugar de psql, puede consultar el esquema del catálogo. Aquí hay una consulta compleja que hace eso:

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
;

Es bastante complejo, pero le muestra el poder y la flexibilidad del catálogo del sistema PostgreSQL y debería ayudarlo a alcanzar el dominio de pg_catalog ;-). Asegúrese de cambiar los% s en la consulta. El primero es Schema y el segundo es el nombre de la tabla.

Gavin M. Roy
fuente
3
Esta consulta se muestra mejor aquí, tenga en cuenta que también sugieren "\ d table"
Flavien Volken
3
Una ventaja de esta solución es que format_type()incluirá cualquier modificador asociado al tipo, por ejemplo numeric(6,2); mientras information_schema.columnsque solo informará el tipo base de numeric.
Eli Collins
3
¿Cómo divido el tipo de datos del tamaño? decir | carácter variable (50) | a 2 columnas: | carácter variable | 50
ivanceras
51

Puede hacerlo con un comando psql slash:

 \d myTable describe table

También funciona para otros objetos:

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

Fuente: faqs.org

devinmoore
fuente
36

El equivalente psql de DESCRIBE TABLEes \d table.

Consulte la parte psql del manual de PostgreSQL para obtener más detalles.

Señor almizclero
fuente
2
Además, la selección de la base de datos psql es \c databasenamemás que use databasename(para aquellos que vienen de MySQL como yo :-). Sin \c databasenameprimero, \d tablenameproduce No relations found.mensaje y nada más.
Ville
27

Esta debería ser la solución:

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

Puede hacer un \d *search pattern * asterisco para encontrar tablas que coincidan con el patrón de búsqueda que le interesa.

Ryan
fuente
Esto era lo que estaba buscando: cómo describir un subconjunto de tablas. Cabe destacar que también encontré que si sus tablas tienen mayúsculas, la sintaxis es \d *"<SubString>"*. Es decir, las comillas dobles deben estar dentro de los asteriscos. Sin embargo, si solo desea la lista de tablas, entonces desea usarla\dt
Randall el
esto coincide con secuencias e índices, así como con tablas
15

Además de la línea de comando \d+ <table_name>que ya encontró, también puede usar el esquema de información para buscar los datos de la columna, usando info_schema.columns

SELECT *
FROM info_schema.columns
WHERE table_schema = 'your_schema'
AND table_name   = 'your_table'
Mushahid Khan
fuente
99
FROM info_schema.columnsno funcionó para mí, tuve que usarlo from information_schema.columns, no estoy seguro si ese es un error tipográfico en su respuesta o algún problema de implementación al final
user27874
14

Use la siguiente instrucción SQL

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

Si reemplaza tbl_name y col_name, muestra el tipo de datos de la columna particular que está buscando.

Sr. Tananki
fuente
3
Eso es lo que dice esta respuesta de 2008.
Quentin
@ Quentin: hay una diferencia en ambos ... la solución anterior de 2008 describe column_name, data_type, character_maximum_length para toda la tabla. Donde como mío, la solución mencionada, solo muestra el tipo de datos de la columna de esquema. Ejecute ambos y verifique. Los dos son diferentes. Todas las soluciones aquí son diferentes formas de resolver un problema. El usuario puede usar esto por diferentes razones
Mr.Tananki,
14

Puedes usar esto:

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

En MySQL , DESCRIBE nombre_tabla


En PostgreSQL , \ d nombre_tabla


O puede usar este comando largo:

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
fuente
7

Para mejorar la consulta SQL de la otra respuesta (¡lo cual es genial!), Aquí hay una consulta revisada. También incluye nombres de restricciones, información de herencia y tipos de datos divididos en sus partes constituyentes (tipo, longitud, precisión, escala). También filtra las columnas que se han descartado (que todavía existen en la base de datos).

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
fuente
4

También puede verificar usando la consulta a continuación

Select * from schema_name.table_name limit 0;

Ejemplo: mi tabla tiene 2 columnas nombre y pwd. Dando captura de pantalla a continuación.

Agregar imagen

* Usando PG admin3

Riya Bansal
fuente
porque seleccionar y esperar que el pgadmin recoja la holgura de obtener los metadatos no es la "mejor práctica"
Mickey Perlstein
2

La mejor manera de describir una tabla como una columna, tipo, modificadores de columnas, etc.

\d+ tablename or \d tablename
guardián
fuente
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
fuente
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
fuente
0

1) TABLA DE DESCRIBA PostgreSQL usando psql

En la herramienta de línea de comando psql, \ d table_name o \ d + table_name para encontrar la información en las columnas de una tabla

2) TABLA DE DESCRIBA PostgreSQL usando información_esquema

Instrucción SELECT para consultar los nombres de columna, tipo de datos, longitud máxima de caracteres de la tabla de columnas en la base de datos de información_esquema;

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

Para más información https://www.postgresqltutorial.com/postgresql-describe-table/

SumiSujith
fuente
-1

/ dt es el comando que enumera todas las tablas presentes en una base de datos. usando el
comando / d y / d + podemos obtener los detalles de una tabla. La sintaxis será como
* / d nombre_tabla (o) \ d + nombre_tabla

Pavan Teja
fuente
-3

Desarrollé el siguiente script para obtener el esquema de la tabla.

'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
fuente
||parece ser algo así como un operador de concatenación (unir cadenas)