Wie erhalte ich eine Liste Spaltennamen und Datentyp einer Tabelle in PostgreSQL?

91

Mit der folgenden Abfrage können wir eine Liste der Spaltennamen und des Datentyps einer Tabelle in PostgreSQL abrufen.

Pratik
quelle

Antworten:

133

Öffnen Sie die psqlBefehlszeile und geben Sie Folgendes ein:

\d+ table_name
Marouane Afroukh
quelle
1
Ich verstehe nicht, warum dies nicht die am besten bewertete Antwort ist.
Mjezzi
18
Dies ist unvollständig, da OP dies möglicherweise programmgesteuert in SQL-Code ausführen möchte, nicht nur über psql.
Luke
Postgres führt dies programmgesteuert aus. Starten Sie Postgres also einfach mit dem Flag '-E': psql -EFür jeden Backslash-Befehl wird die entsprechende SQL vor dem Ergebnis des Befehls angezeigt.
Karatedog
115
select column_name,data_type 
from information_schema.columns 
where table_name = 'table_name';

Mit der obigen Abfrage können Sie Spalten und deren Datentyp

Selva
quelle
4
Dies gibt nicht die richtige Antwort für benutzerdefinierte Typen (z. B. von ogr2ogr erstellte Geometrie- und Geografiespalten , die die Form haben geometry(Geometry,[SRID])).
GT.
1
Man könnte auch verwenden table_catalog = 'my_database'und table_schema = 'my_schema'um nur Spalten aus einer bestimmten Tabelle eines bestimmten Schemas einer bestimmten Datenbank abzurufen.
Marco Mannes
24
SELECT
        a.attname as "Column",
        pg_catalog.format_type(a.atttypid, a.atttypmod) as "Datatype"
    FROM
        pg_catalog.pg_attribute a
    WHERE
        a.attnum > 0
        AND NOT a.attisdropped
        AND a.attrelid = (
            SELECT c.oid
            FROM pg_catalog.pg_class c
                LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
            WHERE c.relname ~ '^(hello world)$'
                AND pg_catalog.pg_table_is_visible(c.oid)
        );

Ändern Sie die Hallo-Welt mit Ihrem Tabellennamen

Weitere Informationen dazu: http://www.postgresql.org/docs/9.3/static/catalog-pg-attribute.html

Pratik
quelle
2
Funktioniert, aber warum verwenden Sie c.relname ~ '^(hello world)$statt einfach c.relname = 'hello world'?
Thomas
18

Vergessen Sie nicht, den Schemanamen hinzuzufügen, falls Sie mehrere Schemas mit denselben Tabellennamen haben.

SELECT column_name, data_type 
FROM information_schema.columns
WHERE table_name = 'your_table_name' AND table_schema = 'your_schema_name';

oder mit psql:

\d+ your_schema_name.your_table_name
Fledermaus Katze
quelle
7

Die Pratik-Antwort wurde aktualisiert, um mehr Schemas und Nullables zu unterstützen:

SELECT
    "pg_attribute".attname                                                    as "Column",
    pg_catalog.format_type("pg_attribute".atttypid, "pg_attribute".atttypmod) as "Datatype",

    not("pg_attribute".attnotnull) AS "Nullable"
FROM
    pg_catalog.pg_attribute "pg_attribute"
WHERE
    "pg_attribute".attnum > 0
    AND NOT "pg_attribute".attisdropped
    AND "pg_attribute".attrelid = (
        SELECT "pg_class".oid
        FROM pg_catalog.pg_class "pg_class"
            LEFT JOIN pg_catalog.pg_namespace "pg_namespace" ON "pg_namespace".oid = "pg_class".relnamespace
        WHERE
            "pg_namespace".nspname = 'schema'
            AND "pg_class".relname = 'table'
    );
Honza Kuchař
quelle
7

Eine Version, die das Suchen der Spaltennamen und -typen einer Tabelle in einem bestimmten Schema unterstützt und JOINs ohne Unterabfragen verwendet

SELECT
    pg_attribute.attname AS column_name,
    pg_catalog.format_type(pg_attribute.atttypid, pg_attribute.atttypmod) AS data_type
FROM
    pg_catalog.pg_attribute
INNER JOIN
    pg_catalog.pg_class ON pg_class.oid = pg_attribute.attrelid
INNER JOIN
    pg_catalog.pg_namespace ON pg_namespace.oid = pg_class.relnamespace
WHERE
    pg_attribute.attnum > 0
    AND NOT pg_attribute.attisdropped
    AND pg_namespace.nspname = 'my_schema'
    AND pg_class.relname = 'my_table'
ORDER BY
    attnum ASC;
Michal Charemza
quelle
2
    SELECT DISTINCT
        ROW_NUMBER () OVER (ORDER BY pgc.relname , a.attnum) as rowid , 
        pgc.relname as table_name ,
        a.attnum as attr,
        a.attname as name,
        format_type(a.atttypid, a.atttypmod) as typ,
        a.attnotnull as notnull, 
        com.description as comment,
        coalesce(i.indisprimary,false) as primary_key,
        def.adsrc as default
    FROM pg_attribute a 
    JOIN pg_class pgc ON pgc.oid = a.attrelid
    LEFT JOIN pg_index i ON 
        (pgc.oid = i.indrelid AND i.indkey[0] = a.attnum)
    LEFT JOIN pg_description com on 
        (pgc.oid = com.objoid AND a.attnum = com.objsubid)
    LEFT JOIN pg_attrdef def ON 
        (a.attrelid = def.adrelid AND a.attnum = def.adnum)
    LEFT JOIN pg_catalog.pg_namespace n ON n.oid = pgc.relnamespace

    WHERE 1=1 
        AND pgc.relkind IN ('r','')
        AND n.nspname <> 'pg_catalog'
        AND n.nspname <> 'information_schema'
        AND n.nspname !~ '^pg_toast'

    AND a.attnum > 0 AND pgc.oid = a.attrelid
    AND pg_table_is_visible(pgc.oid)
    AND NOT a.attisdropped
    ORDER BY rowid
    ;
Yordan Georgiev
quelle
2

Um dieses Thema "vollständiger" zu machen.

Ich benötigte die Spaltennamen und Datentypen für eine SELECT-Anweisung (keine Tabelle).

Wenn Sie dies für eine SELECT-Anweisung anstelle einer tatsächlich vorhandenen Tabelle tun möchten, können Sie Folgendes tun:

DROP TABLE IF EXISTS abc;
CREATE TEMPORARY TABLE abc AS
-- your select statement here!
SELECT 
    *
FROM foo
-- end your select statement
;

select column_name, data_type 
from information_schema.columns 
where table_name = 'abc';
DROP IF EXISTS abc;

Kurze Erklärung: Es wird eine (temporäre) Tabelle Ihrer select-Anweisung erstellt, die Sie über die Abfrage aufrufen können, die unter anderem von @a_horse_with_no_name und @selva bereitgestellt wird.

Hoffe das hilft.

Jens van Hellemondt
quelle
2

Ohne das Schema zu erwähnen, können Sie auch die erforderlichen Details erhalten. Versuchen Sie diese Abfrage->

Wählen Sie Spaltenname, Datentyp aus information_schema.columns aus, wobei table_name = 'table_name';

abhinav kumar
quelle
0

Um Informationen über die Tabellenspalte zu erhalten, können Sie Folgendes verwenden:

\dt+ [tablename]

Um Informationen über den Datentyp in der Tabelle abzurufen, können Sie Folgendes verwenden:

\dT+ [datatype]
bizi
quelle
1
\ dt + Tabellenname erhalten die Informationen über die Tabelle, aber nicht die Spalte
zhihong
0

Wählen Sie Spaltenname, Datentyp aus information_schema.columns aus, wobei table_name = 'your_table_name' und table_catalog = 'your_database_name' und table_schema = 'your_schema_name';

Surendra Babu Pasumarhti
quelle