PostgreSQL "TABELLE BESCHREIBEN"


Antworten:


2820

Versuchen Sie dies (im psqlBefehlszeilentool):

\d+ tablename

Weitere Informationen finden Sie im Handbuch .


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.


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.


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


36

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

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


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'

21

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


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'

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.


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; 


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

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
;

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


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

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                        |

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

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/


-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


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

||scheint so etwas wie ein Verkettungsoperator zu sein (Strings zusammenfügen)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.