Truy vấn PostgreSQL để liệt kê tất cả các tên bảng?


183

Có bất kỳ truy vấn có sẵn để liệt kê tất cả các bảng trong DB Postgres của tôi.

Tôi đã thử một truy vấn như:

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

Nhưng truy vấn này cũng trả về lượt xem.

Làm thế nào tôi có thể chỉ nhận được tên bảng, không xem?

Câu trả lời:


307

Điều gì về truy vấn này (dựa trên mô tả từ hướng dẫn )?

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

4
đây là câu trả lời tốt nhất ở đây
Tommy

3
Một loại bảng là gì?
Bryan Bryce

table_type từ hướng dẫn sử dụng: Loại bảng: BASE TABLE cho bảng cơ sở liên tục (loại bảng thông thường), XEM để xem, NGOẠI TỆ cho bảng nước ngoài hoặc TẠM THỜI cho một bảng tạm thời
tzachs

37

Nếu bạn muốn danh sách cơ sở dữ liệu

SELECT datname FROM pg_database WHERE datistemplate = false;

Nếu bạn muốn danh sách các bảng từ cài đặt pg hiện tại của tất cả các cơ sở dữ liệu

SELECT table_schema,table_name FROM information_schema.tables
ORDER BY table_schema,table_name;

Ít nhất là trong Postgres 9.5, điều đó không đúng. Tôi đã có 3 cơ sở dữ liệu trong một cụm và đây chỉ là các bảng trả về từ cơ sở dữ liệu hiện tại.
sudo

Tài liệu chỉ nói cái hiện tại: postgresql.org/docs/9.5/static/infoschema-tables.html "table_catalog sql_identifier Tên của cơ sở dữ liệu chứa bảng (luôn là cơ sở dữ liệu hiện tại)"
sudo

27

Mở terminal postgres bằng databse bạn muốn:

psql dbname (run this line in a terminal)

Sau đó, chạy lệnh này trong môi trường postgres

\d

Điều này sẽ mô tả tất cả các bảng theo tên. Về cơ bản một danh sách các bảng theo tên tăng dần.

Sau đó, bạn có thể thử điều này để mô tả một bảng theo các trường:

\d tablename.

Hi vọng điêu nay co ich.


@wingedpanther thế nào? có một \dtùy chọn để chỉ liệt kê tất cả các bảng, không có chỉ mục, không có seq, ...?
Peter Krauss

5
Không \dtcó cho điều này?
ngực

11

Thử cái này:

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

cái này hoạt động


Tôi không nghĩ rằng chúng ta cần table_type='BASE TABLE'. Có lẽ tôi sai, bạn có thể vui lòng giải thích?
abriggs

đôi khi rất hữu ích khi lọc DB được kết nối hiện tại thêm: và 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'

1
pg_stat_user_tablescó thể không được điền nếu track_activitiesbị vô hiệu hóa. Sử dụng API "chính thức" như pg_tableshoặc information_schema.tablelà một lựa chọn tốt hơn nhiều .
a_horse_with_no_name


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

Đối với MySQL, bạn sẽ cần table_schema = 'dbName' và đối với MSSQL, hãy xóa điều kiện đó.

Lưu ý rằng "chỉ những bảng và dạng xem được hiển thị rằng người dùng hiện tại có quyền truy cập". Ngoài ra, nếu bạn có quyền truy cập vào nhiều cơ sở dữ liệu và muốn giới hạn kết quả ở một cơ sở dữ liệu nhất định, bạn có thể đạt được điều đó bằng cách thêm điều kiện AND table_catalog = 'yourDatabase' (trong PostgreQuery).

Nếu bạn cũng muốn loại bỏ tiêu đề hiển thị tên hàng và chân trang hiển thị số hàng, bạn có thể khởi động psql bằng tùy chọn dòng lệnh -t (viết tắt chỉ --tuples) hoặc bạn có thể chuyển đổi cài đặt trong psql dòng lệnh của \ t (viết tắt của \ pset tuples_only). Điều này có thể hữu ích, ví dụ khi đường ống đầu ra sang một lệnh khác với \ g [| lệnh].

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.