PostgreSQL "TABELLE BESCHREIBEN"

1854

Wie führen Sie das Äquivalent von Oracle DESCRIBE TABLEin PostgreSQL aus (mit dem Befehl psql)?

Herr Bisamratte
quelle

Antworten:

2820

Versuchen Sie dies (im psqlBefehlszeilentool):

\d+ tablename

Weitere Informationen finden Sie im Handbuch .

Chris Bunch
quelle
8
Ich hatte ursprünglich die Antwort von devinmoore akzeptiert, aber ich mag diese Antwort wirklich besser. Es beschreibt nicht nur die Tabelle, sondern auch die Metadaten wie Spaltenbeschreibungen und ob OIDs vorhanden sind.
Herr Bisamratte
27
Das +ist wirklich Clutch, da PostgresSQL 9 nur die ausführliche Beschreibung für Ansichten gibt, wenn Sie dies tun \d+ table_name, und nicht die einfache\d table_name
nessur
12
\ d funktioniert nicht, wenn Sie es in PosgreSQL 9.1 über pgAdmin aufrufen. Die Antwort von Vinko unten gilt für weitere Fälle
hello_earth
12
psql -Eist praktisch, um die SQL zu erhalten, die implementiert \d+und ähnliche (für die Verwendung außerhalb der psql-Eingabeaufforderung)
bsb
17
Fehler: "Es wurde keine Beziehung mit dem Namen gefunden". Dies bedeutet, dass Sie den Namen Ihrer Tabelle in doppelte Anführungszeichen setzen müssen. Anscheinend wird postgres Ihren Tabellennamen ohne sie in Kleinbuchstaben schreiben und daher Ihre Tabelle nicht finden. Hoffe, das hilft allen anderen, die hierher kommen und dieses Problem haben. :)
Amurrell
742

Zusätzlich zum PostgreSQL-Weg (\ d 'etwas' oder \ dt 'Tabelle' oder \ ds 'Sequenz' und so weiter)

Der SQL-Standardweg, wie hier gezeigt :

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

Es wird von vielen DB-Engines unterstützt.

Vinko Vrsalovic
quelle
23
Wählen Sie Spaltenname, Datentyp, Zeichenmaximumlänge aus INFORMATION_SCHEMA.COLUMNS aus, wobei Tabellenname = 'Tabelle';
Dr. Person Person II
7
Dies ist nützlicher als \ d, wenn Sie mit einem Server vor 8.4 psql und einem Server nach 8.4 stecken bleiben - der Befehl \ d ist nicht kompatibel.
Beldaz
26
Auch dieser Befehl läuft gegen RedShift, wo \d+nicht. Dies ist die beste Antwort IMO
New Alexandria
6
Wunderbar, altged für Postgres Ich würde auch den Schemanamen hinzufügen
ffflabs
3
Dies listet nur Spalten mit minimalen Informationen auf. \ d + gibt die vollständige DDL für die Tabelle an, einschließlich: Standardwerte, Nullfähigkeit, nextval, Genauigkeit, Primärschlüssel, Fremdschlüssel, Indizes, Prüfbedingungen und FKs aus anderen Tabellen.
Bradw2k
70

Wenn Sie es von der Abfrage anstelle von psql erhalten möchten, können Sie das Katalogschema abfragen. Hier ist eine komplexe Abfrage, die das tut:

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 ist ziemlich komplex, aber es zeigt Ihnen die Leistungsfähigkeit und Flexibilität des PostgreSQL-Systemkatalogs und sollte Sie auf den Weg zur pg_catalog-Meisterschaft bringen ;-). Stellen Sie sicher, dass Sie die% s in der Abfrage ändern. Das erste ist Schema und das zweite ist der Tabellenname.

Gavin M. Roy
quelle
3
Diese Abfrage wird besser dargestellt hier beachten , dass sie vorschlagen „\ d - Tabelle“ zu
Flavien Volken
3
Ein Vorteil dieser Lösung besteht darin, dass format_type()alle an den Typ angehängten Modifikatoren enthalten sind, z numeric(6,2). wohingegen information_schema.columnsnur der Basistyp von numeric.
Eli Collins
3
Wie trenne ich den Datentyp von der Größe? sagen | Zeichen variierend (50) | bis 2 Spalten: | Zeichen variieren | 50 |
ivanceras
51

Sie können dies mit einem psql-Schrägstrich tun:

 \d myTable describe table

Es funktioniert auch für andere Objekte:

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

Quelle: faqs.org

devinmoore
quelle
36

Das psql-Äquivalent von DESCRIBE TABLEist \d table.

Weitere Informationen finden Sie im psql-Teil des PostgreSQL-Handbuchs.

Herr Bisamratte
quelle
2
Außerdem ist die Auswahl der psql-Datenbank \c databasenameeher als use databasename(für diejenigen, die wie ich von MySQL kommen :-). Ohne \c databasenamezuerst \d tablenameproduziert No relations found.Nachricht und nichts mehr.
Ville
27

Dies sollte die Lösung sein:

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

Sie können ein \d *search pattern * Sternchen verwenden , um Tabellen zu finden, die dem Suchmuster entsprechen, an dem Sie interessiert sind.

Ryan
quelle
Dies war, wonach ich suchte - wie man eine Teilmenge von Tabellen beschreibt. Bemerkenswerterweise habe ich auch festgestellt, dass die Syntax lautet, wenn Ihre Tabellen Großbuchstaben haben \d *"<SubString>"*. Das heißt, die doppelten Anführungszeichen müssen sich innerhalb der Sternchen befinden. Wenn Sie nur die Liste der Tabellen wollen, dann wollen Sie verwenden\dt
Randall
Dies entspricht Sequenzen und Indizes sowie Tabellen
15

Zusätzlich zu der \d+ <table_name>bereits gefundenen Befehlszeile können Sie auch das Informationsschema verwenden, um die Spaltendaten mithilfe von info_schema.columns nachzuschlagen

SELECT *
FROM info_schema.columns
WHERE table_schema = 'your_schema'
AND table_name   = 'your_table'
Mushahid Khan
quelle
9
FROM info_schema.columnshat bei mir nicht funktioniert Ich musste verwenden from information_schema.columns, nicht sicher, ob das ein Tippfehler in Ihrer Antwort oder ein Implementierungsproblem an meinem Ende ist.
user27874
14

Verwenden Sie die folgende SQL-Anweisung

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

Wenn Sie tbl_name und col_name ersetzen, wird der Datentyp der jeweiligen Spalte angezeigt, nach der Sie suchen.

Mr. Tananki
quelle
3
Das sagt diese Antwort aus dem Jahr 2008.
Quentin
@ Quentin-Es gibt Unterschiede in beiden. Die obige Lösung von 2008 beschreibt Spaltenname, Datentyp, Zeichenmaximumlänge für die gesamte Tabelle. Wobei als meine - die erwähnte Lösung - nur den Datentyp der Schemaspalte anzeigt. Führen Sie beide aus und überprüfen Sie. Sie sind beide unterschiedlich. Alle Lösungen hier sind verschiedene Möglichkeiten, um ein Problem zu lösen. Benutzer kann dies aus verschiedenen Gründen verwenden
Mr. Tananki
14

Sie können dies verwenden:

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

Beschreiben Sie in MySQL den Tabellennamen DESCRIBE


In PostgreSQL \ d Tabellenname


Oder Sie können diesen langen Befehl verwenden:

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

Hier ist eine überarbeitete Abfrage, um die SQL-Abfrage der anderen Antwort zu verbessern (was großartig ist!). Es enthält auch Einschränkungsnamen, Vererbungsinformationen und Datentypen, die in die Bestandteile (Typ, Länge, Genauigkeit, Skalierung) unterteilt sind. Es werden auch Spalten herausgefiltert, die gelöscht wurden (die noch in der Datenbank vorhanden sind).

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

Sie können dies auch mit der folgenden Abfrage überprüfen

Select * from schema_name.table_name limit 0;

Beispiel: Meine Tabelle hat 2 Spaltennamen und pwd. Screenshot unten geben.

Bild hinzufügen

* Verwenden von PG admin3

Riya Bansal
quelle
weil das Auswählen und Erwarten, dass der pgadmin die Lücke beim Abrufen der Metadaten aufnimmt, keine "Best Practice" ist
Mickey Perlstein,
2

Der beste Weg, um eine Tabelle wie eine Spalte, einen Typ, Modifikatoren von Spalten usw. zu beschreiben.

\d+ tablename or \d tablename
Wächter
quelle
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
quelle
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
quelle
0

1) PostgreSQL DESCRIBE TABLE mit psql

Im psql-Befehlszeilentool \ d Tabellenname oder \ d + Tabellenname , um die Informationen zu den Spalten einer Tabelle zu finden

2) PostgreSQL DESCRIBE TABLE mit information_schema

SELECT-Anweisung zum Abfragen der Spaltennamen, des Datentyps und der maximalen Zeichenlänge der Spaltentabelle in der Datenbank information_schema.

SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH aus INFORMATION_SCHEMA.COLUMNS wobei table_name = 'tablename';

Weitere Informationen finden Sie unter https://www.postgresqltutorial.com/postgresql-describe-table/

SumiSujith
quelle
-1

/ dt ist der Befehl, der alle in einer Datenbank vorhandenen Tabellen auflistet. Mit dem
Befehl / d und / d + können wir die Details einer Tabelle abrufen. Die Systemsteuer lautet
* / d Tabellenname (oder) \ d + Tabellenname

Pavan Teja
quelle
-3

Ich habe das folgende Skript für das Abrufen des Tabellenschemas ausgearbeitet.

'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
quelle
||scheint so etwas wie ein Verkettungsoperator zu sein (Strings zusammenfügen)