PostgreSQL “AÇIKLAMA TABLOSU”


Yanıtlar:


2820

Bunu deneyin ( psqlkomut satırı aracında):

\d+ tablename

Daha fazla bilgi için kılavuza bakınız .


8
Aslında devinmoore'un cevabını kabul etmiştim ama bunu daha çok seviyorum. Yalnızca tabloyu tanımlamakla kalmaz, aynı zamanda sütun açıklamaları ve herhangi bir OID varsa meta verileri de gösterir.
Bay Muskrat

27
+Bunu yaptığında sadece görünümler için derinlemesine açıklama verir PostgresSQL 9 olarak, gerçekten debriyaj \d+ table_nameziyade basit daha\d table_name
nessur


12
psql -E\d+ve benzeri (sqql istemi dışında kullanım için) sql almak için kullanışlıdır
BSB

17
Hata: "adlı herhangi bir ilişki bulunamadı". Bu, tablonuzun adını çift tırnak içine almanız gerektiği anlamına gelir. Görünüşe göre postgres, tablo adınızı onlarsız küçük hale getirecek ve bu nedenle tablonuzu bulamayacaktır. Umarım buraya gelen ve bu sorunu yaşayan herkese yardımcı olur. :)
amurrell

742

PostgreSQL yoluna ek olarak (\ d 'bir şey' veya \ dt 'tablo' veya \ ds 'dizisi' vb.)

Burada gösterildiği gibi SQL standart yolu :

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

Birçok db motoru tarafından desteklenir.


23
BİLGİ_SCHEMA.COLUMNS öğesinden sütun_adı, veri_türü, karakter_maximum_uzunluğu seçin; burada table_name = 'table';
Dr. Kişi Kişi II

7
8.4 öncesi bir psql ve bir sonrası 8.4 sunucusuyla sıkışıp kaldığınızda bu \ d'den daha kullanışlıdır - \ d komutu uyumsuzdur.
beldaz

26
Ayrıca bu komut RedShift ile çalışır, burada \d+çalışmaz. Bu en iyi cevap IMO
Yeni İskenderiye

6
Harika, postgres için altought Ben de şema adını eklemek istiyorum
ffflabs

3
Bu, yalnızca minimum bilgi içeren sütunları listeler. \ d + tablo için aşağıdakileri içeren tam DDL'yi verir: varsayılanlar, nullabilite, nextval, kesinlik, birincil anahtar, yabancı anahtarlar, dizinler, kontrol kısıtlamaları ve diğer tablolardaki FK'ler.
bradw2k

70

Psql yerine sorgudan almak istiyorsanız, katalog şemasını sorgulayabilirsiniz. İşte bunu yapan karmaşık bir sorgu:

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
;

Oldukça karmaşık ama size PostgreSQL sistem kataloğunun gücünü ve esnekliğini gösteriyor ve pg_catalog üstatlığı ;-) yolunda gitmeli. Sorgudaki% s değerlerini değiştirdiğinizden emin olun. Birincisi Şema ve ikincisi tablo adıdır.


3
Bu sorgu burada "\ d tablo" da önermek unutmayın
Flavien Volken

3
Bu çözümün bir avantajı format_type(), tipe bağlı herhangi bir değiştiriciyi, örneğin numeric(6,2); oysa information_schema.columnssadece taban türünü bildirecektir numeric.
Eli Collins

3
Veri türünü boyuttan nasıl bölerim? demek | karakter değiştirme (50) | 2 sütuna kadar: | karakter değiştirme | 50 |
ivanceras

51

Bunu bir psql eğik çizgi komutuyla yapabilirsiniz:

 \d myTable describe table

Ayrıca diğer nesneler için de çalışır:

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

Kaynak: faqs.org


36

Arasında psql'in eşdeğer DESCRIBE TABLEIS\d table .

Daha fazla ayrıntı için PostgreSQL kılavuzunun psql bölümüne bakın.


2
Ayrıca, psql veritabanı seçimi \c databasenameyerine use databasenamebenim gibi MySQL gelenler için :-). \c databasenameİlk olmadan mesaj \d tablenameüretir No relations found.ve başka bir şey yapmaz.
Ville

27

Çözüm bu olmalı:

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

21

İlgilendiğiniz arama modeliyle eşleşen tabloları bulmak \d *search pattern * için yıldız işaretli bir yapabilirsiniz .


Aradığım şey buydu - tabloların bir alt kümesini nasıl tanımlayacağım . Ayrıca, tablolarınızda büyük harf varsa sözdiziminin de olduğunu fark ettim \d *"<SubString>"*. Yani, çift tırnaklar yıldızların içinde olmalıdır . Yine de, sadece tablo listesini istiyorsanız o zaman kullanmak istiyorsunuz\dt
Randall

Bu, sekanslar ve dizinlerle ve tablolarla

15

Bulduğunuz komut satırına ek olarak, info_schema.columns komutunu kullanarak sütun verilerini aramak \d+ <table_name>için bilgi şemasını da kullanabilirsiniz.

SELECT *
FROM info_schema.columns
WHERE table_schema = 'your_schema'
AND table_name   = 'your_table'

9
FROM info_schema.columnsbenim için işe yaramadı kullanmak zorundaydım from information_schema.columns, cevabında bir yazım hatası ya da sonunda bazı uygulama sorunu olup olmadığından emin değilim.
user27874

14

Aşağıdaki SQL deyimini kullanın

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

Tbl_name ve col_name öğelerini değiştirirseniz, aradığınız belirli bir sütunun veri türünü görüntüler.


3
İşte ne bu cevap 2008'den itibaren söylüyor.
Quentin

@ Quentin-İkisinde de fark var .. 2008'in üstündeki Çözüm tüm tablo için sütun_adı, veri_türü, karakter_maximum_length değerini açıklar. Benimki olarak - belirtilen çözüm - sadece şema sütununun veri türünü gösterir. Her ikisini de çalıştırın ve kontrol edin. İkisi de farklı. Buradaki tüm çözümler bir sorunu çözmenin farklı yoludur. Kullanıcı bunu farklı nedenlerle kullanabilir
Mr.Tananki

14

Bunu kullanabilirsiniz:

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


7

In MySQL , tablo_adı DESCRIBE


Gelen PostgreSQL , \ d table_name


Veya bu uzun komutu kullanabilirsiniz:

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

Diğer cevabın SQL sorgusunda (ki bu harika!) Geliştirmek için, burada düzeltilmiş bir sorgu var. Ayrıca, kısıtlama adları, kalıtım bilgileri ve bileşen parçalarına (tip, uzunluk, kesinlik, ölçek) ayrılmış veri türlerini de içerir. Ayrıca bırakılan (hala veritabanında bulunan) sütunları filtreler.

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

Aşağıdaki sorguyu kullanarak da kontrol edebilirsiniz

Select * from schema_name.table_name limit 0;

Expmple: Masamın 2 sütun adı ve pwd'si var. Aşağıdaki ekran görüntüsünü veriyoruz.

Görüntü ekleme

* PG admin3 kullanma


çünkü pgadmin'in seçilmesi ve meta verilerin elde edilmesinin boşluğunu beklemesi "en iyi uygulama" değildir
Mickey Perlstein

2

Sütun, tür, sütun değiştiricileri vb. Gibi bir tabloyu tanımlamanın en iyi yolu.

\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) psql kullanarak PostgreSQL AÇIKLAMA TABLOSU

Psql komut satırı aracında, tablonun sütunları hakkındaki bilgileri bulmak için \ d tablo_adı veya \ d + tablo_adı

2) Bilgi_semalarını kullanarak PostgreSQL AÇIKLAMA TABLOSU

İnformation_schema veritabanındaki sütunlar tablosunun sütun_adı, veri türü, karakter maksimum uzunluğunu sorgulamak için SELECT ifadesi;

BİLGİ_SCHEMA.COLUMNS arasından COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH değerlerini seçin; burada table_name = 'tablename';

Daha fazla bilgi için https://www.postgresqltutorial.com/postgresql-describe-table/


-1

/ dt, bir veritabanında bulunan tüm tabloları listeleyen bir yazılımdır. kullanarak
/ d komutunu ve / d biz bir tablo ayrıntıları alabilirsiniz +. Sysntax
* / d tablo_adı (veya) \ d + tablo_adı şeklinde olacaktır.


-3

Tablo şemasını almak için aşağıdaki komut dosyasını çalıştım.

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

||bir birleştirme operatörü gibi görünüyor (dizeleri birleştirmek)
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.