2179 Stimmen

PostgreSQL "DESCRIBE TABLE"

Wie führen Sie das Äquivalent zu Oracles DESCRIBE TABLE in PostgreSQL (mit dem Befehl psql)?

11voto

MisterJoyson Punkte 299

Sur MySQL , DESCRIBE tabelle_name


Sur PostgreSQL , \d tabellen_name


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

9voto

anurag2090 Punkte 113

Diese Variante der Abfrage (wie in anderen Antworten erläutert) hat bei mir funktioniert.

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

Sie wird hier im Detail beschrieben: http://www.postgresqltutorial.com/postgresql-describe-table/

8voto

Howard Elton Punkte 146

Um die SQL-Abfrage der anderen Antwort (die großartig ist!) zu verbessern, ist hier eine überarbeitete Abfrage. Sie enthält auch Namen von Beschränkungen, Vererbungsinformationen und einen in seine Bestandteile zerlegten Datentyp (Typ, Länge, Genauigkeit, Maßstab). Außerdem werden Spalten herausgefiltert, die gelöscht wurden (die aber 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
;

8voto

meenal Punkte 164

In postgres \d wird verwendet, um die Tabellenstruktur zu beschreiben.

z.B.. \d schema_name.table_name

Mit diesem Befehl erhalten Sie die grundlegenden Informationen über die Tabelle, wie Spalten, Typ und Modifikatoren.

Wenn Sie mehr über die Verwendung von Tabellen erfahren möchten

\d+ schema_name.table_name

Hier erhalten Sie zusätzliche Informationen wie Speicherplatz, Statistikziel und Beschreibung

5voto

Guardian Punkte 343

Die beste Art und Weise, eine Tabelle zu beschreiben, wie z. B. eine Spalte, ein Typ, Modifikatoren von Spalten usw.

\d+ tablename or \d tablename

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X