PostgreSQL "DÉCRIRE le TABLEAU"

comment effectuer l'équivalent du DESCRIBE TABLE D'Oracle dans PostgreSQL (en utilisant la commande psql)?

1530
demandé sur lospejos 2008-09-21 00:47:48

18 réponses

essayez ceci (dans l'outil en ligne de commande psql ):

\d+ tablename

Voir le manuel pour plus d'info.

2347
répondu Chris Bunch 2015-02-26 11:55:36

en plus de la méthode PostgreSQL (\d 'something' ou \dt 'table' ou \ds 'sequence' et ainsi de suite)

La norme SQL façon, comme le montre ici :

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

il est supporté par de nombreux moteurs db.

589
répondu Vinko Vrsalovic 2017-05-23 12:10:54

si vous voulez l'obtenir à partir de requête au lieu de psql, vous pouvez interroger le schéma de catalogue. Voici une requête complexe qui fait cela:

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
;

c'est assez complexe, mais il ne vous montre la puissance et la flexibilité du catalogue système de PostgreSQL et devrait vous obtenir sur votre chemin à la maîtrise pg_catalog ;-). Assurez-vous de changer le %s dans la requête. Le premier est Schema et le second est le nom de la table.

57
répondu Gavin M. Roy 2012-10-22 09:38:18

vous pouvez le faire avec une commande psql slash:

 \d myTable describe table

cela fonctionne aussi pour d'autres objets:

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

Source: faqs.org

45
répondu devinmoore 2015-09-22 19:18:33

l'équivalent psql de DESCRIBE TABLE est \d table .

voir la partie psql du manuel PostgreSQL pour plus de détails.

31
répondu Mr. Muskrat 2014-03-05 20:49:33

vous pouvez faire un \d *search pattern * avec des astérisques pour trouver des tables qui correspondent au modèle de recherche que vous êtes intéressé.

20
répondu Ryan 2014-06-05 14:07:30

en plus de la ligne de commande \d+ <table_name> que vous avez déjà trouvé, vous pouvez également utiliser le information-schema pour rechercher les données de la colonne, en utilisant info_schema.colonnes

SELECT *
FROM info_schema.columns
WHERE table_schema = 'your_schema'
AND table_name   = 'your_table'
12
répondu Mushahid Khan 2016-04-17 19:57:09

vous pouvez utiliser ceci:

SELECT attname 
FROM pg_attribute,pg_class 
WHERE attrelid=pg_class.oid 
AND relname='TableName' 
AND attstattarget <>0; 
12
répondu YATK 2017-08-28 21:10:25

utilisez L'énoncé SQL suivant

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

si vous remplacez tbl_name et col_name, il affiche le type de données de la colonne particulière que vous recherchez.

9
répondu Mr.Tananki 2017-08-28 17:41:24

cette variante de la requête (comme expliqué dans d'autres réponses) a fonctionné pour moi.

SELECT
 COLUMN_NAME
FROM
 information_schema.COLUMNS
WHERE
 TABLE_NAME = 'city';

c'est décrit ici en détail: http://www.postgresqltutorial.com/postgresql-describe-table /

5
répondu codeUrDream 2018-02-14 13:46:49

la meilleure façon de décrire un tableau tel qu'une colonne, type, modificateurs de colonnes, etc.

\d+ tablename or \d tablename
4
répondu Guardian 2017-08-06 15:25:06

In MySQL , DESCRIBE table_name


In PostgreSQL , \d table_name


ou, vous pouvez utiliser cette longue commande:

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
4
répondu MisterJoyson 2018-04-10 08:53:41

vous pouvez aussi vérifier en utilisant la requête ci-dessous

Select * from schema_name.table_name limit 0;

Expmple: ma table a 2 nom de colonne et pwd. En donnant la capture d'écran ci-dessous.

Adding image

* utilisant PG admin3

3
répondu Riya Bansal 2016-12-12 14:51:12
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                        |
3
répondu Usman Yaqoob 2017-07-20 13:22:39

/ dt est la virgule Qui Vous liste Toutes les tables présentes dans une base de données. en utilisant

/commande d et /d+, nous pouvons obtenir les détails d'un tableau. Le sysntax sera comme

* /d table_name (ou) \d+ table_name

0
répondu Pavan Teja 2017-08-09 06:03:09
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
0
répondu meenal 2018-06-18 09:14:42

pour améliorer la requête SQL de l'autre réponse (ce qui est génial!), voici une version révisée de la requête. Il inclut également des noms de contraintes, des informations sur les héritages, et des types de données divisées en ses parties constituantes (type, Longueur, précision, échelle). Il filtre également les colonnes qui ont été supprimées (qui existent toujours dans la base de données).

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
;
0
répondu Howard Elton 2018-10-02 18:56:48

j'ai élaboré le script suivant pour obtenir le schéma de table.

'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;
-1
répondu paulg 2018-03-23 00:02:44