Bagaimana Anda melakukan yang setara dengan Oracle DESCRIBE TABLE
di PostgreSQL (menggunakan perintah psql)?
Bagaimana Anda melakukan yang setara dengan Oracle DESCRIBE TABLE
di PostgreSQL (menggunakan perintah psql)?
Jawaban:
+
benar-benar kopling, karena PostgresSQL 9 hanya memberikan deskripsi mendalam untuk tampilan saat Anda melakukannya \d+ table_name
, daripada yang sederhana\d table_name
psql -E
berguna untuk mendapatkan sql yang mengimplementasikan \d+
dan serupa (untuk digunakan di luar prompt psql)
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.
\d+
tidak. Ini adalah jawaban terbaik IMO
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.
format_type()
akan mencakup pengubah yang melekat pada tipe, misalnya numeric(6,2)
; sedangkan information_schema.columns
hanya akan melaporkan tipe dasar numeric
.
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
Setara dengan psql DESCRIBE TABLE
adalah \d table
.
Lihat bagian psql manual PostgreSQL untuk lebih jelasnya.
\c databasename
lebih daripada use databasename
(bagi mereka yang datang dari MySQL seperti saya :-). Tanpa \c databasename
dulu, \d tablename
menghasilkan No relations found.
pesan dan tidak lebih.
Anda dapat melakukan \d *search pattern *
dengan tanda bintang untuk menemukan tabel yang cocok dengan pola pencarian yang Anda minati.
\d *"<SubString>"*
. Artinya, tanda kutip ganda harus berada di dalam tanda bintang. Padahal, jika Anda hanya ingin daftar tabel maka Anda ingin menggunakan\dt
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'
FROM info_schema.columns
tidak 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.
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.
Variasi kueri ini (seperti yang dijelaskan dalam jawaban lain) bekerja untuk saya.
SELECT
COLUMN_NAME
FROM
information_schema.COLUMNS
WHERE
TABLE_NAME = 'city';
Dijelaskan di sini secara rinci: http://www.postgresqltutorial.com/postgresql-describe-table/
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
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
;
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.
* Menggunakan PG admin3
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 |
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
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/
/ 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
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;