PostgreSQL'de bir tablonun sütun adları ve veri türü listesi nasıl elde edilir?


93

Aşağıdaki sorgu ile PostgreSQL'deki bir tablonun sütun isimlerinin ve veri tiplerinin bir listesini alabiliriz.

Yanıtlar:


133

psqlKomut satırını açın ve şunu yazın:

\d+ table_name

1
Bunun neden en çok oy alan cevap olmadığını anlamıyorum.
mjezzi

18
OP bunu sadece psql yoluyla değil, SQL kodunda programlı olarak yapmak isteyebileceği için bu eksiktir.
Luke

Postgres bunu programlı olarak yapar, bu nedenle postgres'e '-E' bayrağıyla başlayın: psql -Eve her ters eğik çizgi komutu için ilgili SQL, komutun sonucundan önce görüntülenecektir.
karatedog

118
select column_name,data_type 
from information_schema.columns 
where table_name = 'table_name';

yukarıdaki sorgu ile sütunları ve veri türünü


4
Yani (yarattığı örneğin Geometri ve Coğrafya sütunları kullanıcı tanımlı türleri için doğru cevap vermeyecektir ogr2ogr formunun vardır geometry(Geometry,[SRID])).
GT.

1
Ayrıca belirli bir veritabanının belirli bir şemasının belirli bir tablosundan yalnızca sütunları elde etmek için table_catalog = 'my_database've kullanılabilir table_schema = 'my_schema'.
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)
        );

Merhaba dünyayı masa adınızla değiştirin

Bununla ilgili daha fazla bilgi: http://www.postgresql.org/docs/9.3/static/catalog-pg-attribute.html


2
Çalışıyor, ama neden c.relname ~ '^(hello world)$basitçe yerine kullanıyorsunuz c.relname = 'hello world'?
Thomas

18

Aynı tablo adlarına sahip birden çok şemanız olması durumunda şema adını eklemeyi unutmayın.

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

veya psql kullanarak:

\d+ your_schema_name.your_table_name

7

Daha fazla şema ve boş değeri desteklemek için güncellenmiş Pratik yanıt:

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

7

Belirli bir şemada bir tablonun sütun adlarını ve türlerini bulmayı destekleyen ve alt sorgu olmadan JOIN'leri kullanan bir sürüm

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;

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
    ;

2

Bu konuyu 'daha eksiksiz' hale getirmek için.

Bir SELECT ifadesindeki (tablo değil) sütun adlarını ve veri türlerini gerekli kıldı.

Bunu mevcut bir tablo yerine bir SELECT deyiminde yapmak istiyorsanız, aşağıdakileri yapabilirsiniz:

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;

Kısa açıklama, @a_horse_with_no_name ve @selva tarafından (diğerleri arasında) sağlanan sorgu aracılığıyla 'arayabileceğiniz' select ifadenizin bir (geçici) tablosunu oluşturur.

Bu yardımcı olur umarım.


2

şemadan bahsetmeden gerekli detayları da alabilirsiniz Bu sorguyu deneyin->

information_schema.columns'dan column_name, data_type seçin, burada tablo_adı = 'tablo_adı';


0

Tablonun sütunu hakkında bilgi almak için şunları kullanabilirsiniz:

\dt+ [tablename]

Tablodaki veri türü hakkında bilgi almak için şunları kullanabilirsiniz:

\dT+ [datatype]

1
\ dt + tablename tablo hakkındaki bilgileri alır, ancak sütun değil
zhihong

0

information_schema.columns'dan column_name, data_type seçin; burada table_name = 'your_table_name' ve table_catalog = 'your_database_name' ve table_schema = 'your_schema_name';

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.