PostgreSQL "DESCRIBE TABLE"

1854

Bagaimana Anda melakukan yang setara dengan Oracle DESCRIBE TABLEdi PostgreSQL (menggunakan perintah psql)?

Tuan Muskrat
sumber

Jawaban:

2820

Coba ini (di psqlalat baris perintah):

\d+ tablename

Lihat manual untuk info lebih lanjut.

Chris Bunch
sumber
8
Saya awalnya menerima jawaban devinmoore tetapi saya sangat menyukai yang ini. Tidak hanya menggambarkan tabel tetapi juga menunjukkan metadata seperti deskripsi kolom dan jika ada OID.
Tn. Muskrat
27
Ini +benar-benar kopling, karena PostgresSQL 9 hanya memberikan deskripsi mendalam untuk tampilan saat Anda melakukannya \d+ table_name, daripada yang sederhana\d table_name
nessur
12
\ d tidak berfungsi ketika Anda menjalankannya di PosgreSQL 9.1 hingga pgAdmin, jawaban Vinko di bawah ini berlaku untuk lebih banyak kasus
hello_earth
12
psql -Eberguna untuk mendapatkan sql yang mengimplementasikan \d+dan serupa (untuk digunakan di luar prompt psql)
bsb
17
Kesalahan: "tidak menemukan relasi bernama". Ini berarti Anda harus membungkus nama tabel Anda dengan tanda kutip ganda. Rupanya, postgres akan mengurangi nama tabel Anda tanpa mereka dan karena itu tidak menemukan tabel Anda. Semoga ini bisa membantu orang lain yang datang ke sini dan memiliki masalah ini. :)
amurrell
742

Selain cara PostgreSQL (\ d 'something' atau \ dt 'table' atau \ ds 'sequence' dan seterusnya)

Cara standar SQL, seperti yang ditunjukkan di sini :

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

Ini didukung oleh banyak mesin db.

Vinko Vrsalovic
sumber
23
pilih column_name, data_type, character_maximum_length dari INFORMATION_SCHEMA.COLUMNS di mana table_name = 'table';
Dr. Person Person II
7
Ini lebih berguna daripada \ d ketika Anda terjebak dengan server pre-8.4 psql dan post-8.4 - perintah \ d tidak kompatibel.
beldaz
26
Juga perintah ini berjalan melawan RedShift, di mana \d+tidak. Ini adalah jawaban terbaik IMO
New Alexandria
6
Hebat, untuk postgres saya akan menambahkan nama skema juga
ffflabs
3
Ini hanya mencantumkan kolom dengan informasi minimal. \ d + memberikan DDL lengkap untuk tabel termasuk: default, nullability, nextval, presisi, kunci primer, kunci asing, indeks, periksa kendala, dan FK dari tabel lain.
bradw2k
70

Jika Anda ingin mendapatkannya dari kueri alih-alih psql, Anda dapat meminta skema katalog. Inilah permintaan kompleks yang melakukan itu:

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
;

Ini cukup rumit tetapi tidak menunjukkan kekuatan dan fleksibilitas dari katalog sistem PostgreSQL dan akan membuat Anda menuju penguasaan pg_catalog ;-). Pastikan untuk mengubah% s di kueri. Yang pertama adalah Skema dan yang kedua adalah nama tabel.

Gavin M. Roy
sumber
3
Kueri ini lebih baik ditampilkan di sini, perhatikan bahwa mereka menyarankan "\ d table" juga
Flavien Volken
3
Salah satu keuntungan dari solusi ini adalah bahwa format_type()akan mencakup pengubah yang melekat pada tipe, misalnya numeric(6,2); sedangkan information_schema.columnshanya akan melaporkan tipe dasar numeric.
Eli Collins
3
Bagaimana cara membagi tipe data dari ukuran? katakan | karakter bervariasi (50) | ke 2 kolom: | karakter yang bervariasi | 50 |
ivanceras
51

Anda dapat melakukannya dengan perintah slash psql:

 \d myTable describe table

Ini juga berfungsi untuk objek lain:

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

Sumber: faqs.org

devinmoore
sumber
36

Setara dengan psql DESCRIBE TABLEadalah \d table.

Lihat bagian psql manual PostgreSQL untuk lebih jelasnya.

Tuan Muskrat
sumber
2
Juga, pemilihan basis data psql \c databasenamelebih daripada use databasename(bagi mereka yang datang dari MySQL seperti saya :-). Tanpa \c databasenamedulu, \d tablenamemenghasilkan No relations found.pesan dan tidak lebih.
Ville
27

Ini harus menjadi solusinya:

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

Anda dapat melakukan \d *search pattern * dengan tanda bintang untuk menemukan tabel yang cocok dengan pola pencarian yang Anda minati.

Ryan
sumber
Inilah yang saya cari - bagaimana menggambarkan subset tabel. Sebagai catatan, saya juga menemukan bahwa jika tabel Anda memiliki huruf besar, sintaksnya adalah \d *"<SubString>"*. Artinya, tanda kutip ganda harus berada di dalam tanda bintang. Padahal, jika Anda hanya ingin daftar tabel maka Anda ingin menggunakan\dt
Randall
ini cocok dengan urutan dan indeks serta tabel
15

Selain baris perintah \d+ <table_name>yang sudah Anda temukan, Anda juga bisa menggunakan skema informasi untuk mencari data kolom, menggunakan info_schema.columns

SELECT *
FROM info_schema.columns
WHERE table_schema = 'your_schema'
AND table_name   = 'your_table'
Mushahid Khan
sumber
9
FROM info_schema.columnstidak berfungsi untuk saya, saya harus menggunakan from information_schema.columns, tidak yakin apakah itu salah ketik dalam jawaban Anda atau beberapa masalah implementasi di akhir saya.
user27874
14

Gunakan pernyataan SQL berikut

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

Jika Anda mengganti tbl_name dan col_name, ini akan menampilkan tipe data dari kolom tertentu yang Anda cari.

Mr.Tananki
sumber
3
Itulah yang dikatakan jawaban dari tahun 2008 ini.
Quentin
@ Quentin-Ada perbedaan di keduanya .. Solusi 2008 di atas menjelaskan nama_kolom, tipe data, karakter_maksimum_length untuk seluruh tabel. Sedangkan sebagai milik saya - solusi yang disebutkan - hanya menunjukkan tipe data dari kolom skema. Jalankan keduanya dan periksa. Keduanya berbeda. Semua solusi di sini adalah berbagai cara untuk menyelesaikan masalah. Pengguna dapat menggunakan ini untuk berbagai alasan
Mr.Tananki
14

Anda bisa menggunakan ini:

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

Di MySQL , DESCRIBE table_name


Di PostgreSQL , \ d table_name


Atau, Anda dapat menggunakan perintah panjang ini:

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
MisterJoyson
sumber
7

Untuk memperbaiki kueri SQL jawaban lain (yang hebat!), Berikut adalah kueri yang direvisi. Ini juga termasuk nama kendala, informasi warisan, dan tipe data yang dipecah menjadi bagian-bagian penyusunnya (tipe, panjang, presisi, skala). Itu juga menyaring kolom yang telah dijatuhkan (yang masih ada di database).

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
;
Howard Elton
sumber
4

Anda juga dapat memeriksa menggunakan kueri di bawah ini

Select * from schema_name.table_name limit 0;

Expmple: Tabel saya memiliki 2 nama kolom dan pwd. Memberikan tangkapan layar di bawah ini.

Menambahkan gambar

* Menggunakan PG admin3

Riya Bansal
sumber
karena memilih dan mengharapkan pgadmin untuk mengambil kelonggaran mendapatkan data meta bukanlah "praktik terbaik"
Mickey Perlstein
2

Cara terbaik untuk menggambarkan tabel seperti kolom, jenis, pengubah kolom, dll.

\d+ tablename or \d tablename
Wali
sumber
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                        |
Usman Yaqoob
sumber
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
meenal
sumber
0

1) TABEL DESKRIPSI PostgreSQL menggunakan psql

Dalam alat baris perintah psql, \ d table_name atau \ d + table_name untuk menemukan informasi pada kolom tabel

2) TABEL KETERANGAN PostgreSQL menggunakan information_schema

SELECT pernyataan untuk query nama_kolom, tipe data, panjang karakter maksimum dari tabel kolom dalam database information_schema;

SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH dari INFORMATION_SCHEMA.COLUMNS di mana table_name = 'tablename';

Untuk informasi lebih lanjut https://www.postgresqltutorial.com/postgresql-describe-table/

SumiSujith
sumber
-1

/ dt adalah commad yang mencantumkan semua tabel yang ada dalam database. menggunakan
perintah / d dan / d + kita bisa mendapatkan rincian tabel. Sysntax akan seperti
* / d table_name (atau) \ d + table_name

Pavan Teja
sumber
-3

Saya mengerjakan skrip berikut untuk mendapatkan skema tabel.

'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;
paulg
sumber
||tampaknya menjadi sesuatu seperti operator gabungan (menyatukan string)