Permintaan postgreSQL untuk mencantumkan semua nama tabel?

184

Apakah ada pertanyaan yang tersedia untuk mendaftar semua tabel di Postgres DB saya.

Saya mencoba satu permintaan seperti:

SELECT table_name FROM information_schema.tables
                      WHERE table_schema='public' 

Tetapi kueri ini mengembalikan tampilan juga.

Bagaimana saya bisa mendapatkan hanya nama tabel saja, bukan tampilan?

jobi88
sumber

Jawaban:

307

Apa tentang permintaan ini (berdasarkan uraian dari manual )?

SELECT table_name
  FROM information_schema.tables
 WHERE table_schema='public'
   AND table_type='BASE TABLE';
vyegorov
sumber
4
ini jawaban terbaik di sini.
Tommy
3
Apa itu tipe tabel?
Bryan Bryce
table_type dari manual: Jenis tabel: BASE TABLE untuk tabel dasar persisten (tipe tabel normal), LIHAT untuk tampilan, ASING untuk tabel asing, atau LOKAL TEMPORER untuk tabel sementara
tzachs
38

Jika Anda ingin daftar database

SELECT datname FROM pg_database WHERE datistemplate = false;

Jika Anda ingin daftar tabel dari instalasi pg saat ini dari semua database

SELECT table_schema,table_name FROM information_schema.tables
ORDER BY table_schema,table_name;
Keras
sumber
Paling tidak di Postgres 9.5, itu tidak benar. Saya punya 3 database dalam satu cluster, dan ini hanya mengembalikan tabel dari database saat ini.
sudo
Dokumentasi hanya mengatakan yang sekarang: postgresql.org/docs/9.5/static/infoschema-tables.html "table_catalog sql_identifier Nama database yang berisi tabel (selalu database saat ini)"
sudo
28

Buka terminal postgres dengan databse yang Anda inginkan:

psql dbname (run this line in a terminal)

kemudian, jalankan perintah ini di lingkungan postgres

\d

Ini akan menjelaskan semua tabel dengan nama. Pada dasarnya daftar tabel dengan nama menaik.

Kemudian Anda bisa mencoba ini untuk menggambarkan tabel dengan bidang:

\d tablename.

Semoga ini membantu.

Ty_
sumber
@wingedpanther gimana caranya? ada \dopsi untuk mendaftar hanya semua tabel, tanpa indeks, tanpa seq, ...?
Peter Krauss
5
Apakah \dttidak ada untuk ini?
thoroc
11

Coba ini:

SELECT table_name 
FROM information_schema.tables 
WHERE table_schema='public' AND table_type='BASE TABLE'

ini bekerja!

TS
sumber
Saya pikir kita tidak perlu table_type='BASE TABLE'. Mungkin saya salah, bisa tolong jelaskan?
Abriggs
kadang-kadang berguna memfilter penambahan terhubung DB saat ini: dan table_catalog = current_database ()
Diego Scaravaggi
8
select 
 relname as table 
from 
 pg_stat_user_tables 
where schemaname = 'public'

select 
  tablename as table 
from 
  pg_tables  
where schemaname = 'public'
Vivek S.
sumber
1
pg_stat_user_tablesmungkin tidak diisi jika track_activitiesdinonaktifkan. Menggunakan API "resmi" seperti pg_tablesatau information_schema.tablemerupakan pilihan yang jauh lebih baik.
a_horse_with_no_name
0
SELECT table_name
FROM information_schema.tables
WHERE table_type='BASE TABLE'
AND table_schema='public';

Untuk MySQL Anda perlu table_schema = 'dbName' dan untuk MSSQL hapus kondisi itu.

Perhatikan bahwa "hanya tabel dan tampilan yang ditampilkan yang dapat diakses oleh pengguna saat ini". Juga, jika Anda memiliki akses ke banyak basis data dan ingin membatasi hasilnya pada basis data tertentu, Anda dapat mencapainya dengan menambahkan kondisi AND table_catalog = 'database Anda' (dalam PostgreSQL).

Jika Anda juga ingin menyingkirkan tajuk yang menampilkan nama baris dan catatan kaki yang menunjukkan jumlah baris, Anda bisa memulai psql dengan opsi baris perintah -t (kependekan --tuples-saja) atau Anda dapat beralih pengaturan di psql's baris perintah oleh \ t (kependekan dari \ pset tuples_only). Ini bisa berguna misalnya ketika memipis output ke perintah lain dengan \ g [| perintah].

Kashif
sumber