Danh sách tất cả các bảng


125

Tôi muốn liệt kê tất cả các bảng trong liferaycơ sở dữ liệu trong bản cài đặt PostgreSQL của tôi. Làm thế nào để làm điều đó?

Tôi muốn thực hiện SELECT * FROM applications;trong liferaycơ sở dữ liệu. applicationslà một bảng trong db suốt đời của tôi. Làm thế nào được thực hiện?

Đây là danh sách tất cả các cơ sở dữ liệu của tôi:

postgres=# \list
                              List of databases
Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
 -----------+----------+----------+-------------+-------------+-----------------------
 liferay   | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =Tc/postgres         +
           |          |          |             |             | postgres=CTc/postgres+
           |          |          |             |             | liferay=CTc/postgres
 lportal   | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | 
 postgres  | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | 
 template0 | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(5 rows)

postgres=# 

Câu trả lời:


203

Nếu bạn muốn liệt kê tất cả các bảng, bạn phải sử dụng:

\dt *.*

để chỉ ra rằng bạn muốn tất cả các bảng trong tất cả các lược đồ . Điều này sẽ bao gồm các bảng trong pg_catalog, các bảng hệ thống và các bảng trong information_schema. Không có cách tích hợp nào để nói "tất cả các bảng trong tất cả các lược đồ do người dùng định nghĩa"; tuy nhiên, bạn có thể đặt search_pathdanh sách của bạn vào danh sách tất cả các lược đồ quan tâm trước khi chạy \dt.

Bạn có thể muốn thực hiện việc này theo chương trình, trong trường hợp đó psqlcác lệnh dấu gạch chéo ngược sẽ không thực hiện công việc. Đây là nơi cácINFORMATION_SCHEMA đến để giải cứu. Để liệt kê các bảng:

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

BTW, nếu bạn muốn xem những gì psqlđang làm để đáp lại lệnh dấu gạch chéo ngược, hãy chạy psqlvới -Ecờ. ví dụ:

$ psql -E regress    
regress=# \list
********* QUERY **********
SELECT d.datname as "Name",
       pg_catalog.pg_get_userbyid(d.datdba) as "Owner",
       pg_catalog.pg_encoding_to_char(d.encoding) as "Encoding",
       d.datcollate as "Collate",
       d.datctype as "Ctype",
       pg_catalog.array_to_string(d.datacl, E'\n') AS "Access privileges"
FROM pg_catalog.pg_database d
ORDER BY 1;
**************************

vì vậy bạn có thể thấy đó psqllà tìm kiếm pg_catalog.pg_databasekhi nó nhận được một danh sách các cơ sở dữ liệu. Tương tự, đối với các bảng trong cơ sở dữ liệu đã cho:

SELECT n.nspname as "Schema",
  c.relname as "Name",
  CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' WHEN 'f' THEN 'foreign table' END as "Type",
  pg_catalog.pg_get_userbyid(c.relowner) as "Owner"
FROM pg_catalog.pg_class c
     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r','')
      AND n.nspname <> 'pg_catalog'
      AND n.nspname <> 'information_schema'
      AND n.nspname !~ '^pg_toast'
  AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1,2;

Bạn nên sử dụng tiêu chuẩn SQL, di động INFORMATION_SCHEMAthay vì các danh mục hệ thống PG nếu có thể, nhưng đôi khi bạn cần thông tin cụ thể về PG. Trong những trường hợp đó, thật tốt khi truy vấn danh mục hệ thống trực tiếp và psql -Ecó thể là một hướng dẫn hữu ích cho cách thực hiện.


information_schema.tablesbao gồm các quan điểm cho một số lý do. (Trong
PostgreQuery

@ jpmc26 Có, với table_type = 'VIEW', vì vậy họ dễ dàng loại trừ. Nói chung, SQL cố gắng xử lý các khung nhìn giống như các bảng càng nhiều càng tốt.
Craig Ringer

94

Kết nối với cơ sở dữ liệu, sau đó liệt kê các bảng:

\c liferay
\dt

Đó là cách tôi làm điều đó.

Bạn có thể kết hợp hai lệnh đó trên một dòng, nếu bạn thích:

\c liferay \dt

2
Bạn thực sự muốn \dt *.*nếu không phải tất cả các bảng quan tâm là trên search_path.
Craig Ringer

10

Để xem các bảng công khai, bạn có thể làm

bảng danh sách

\dt

bảng liệt kê, xem và đặc quyền truy cập

\dp or \z

hoặc chỉ tên bảng

select table_name from information_schema.tables where table_schema = 'public';

2

Trong SQL Query, bạn có thể viết mã này:

select table_name from information_schema.tables where table_schema='YOUR_TABLE_SCHEME';

Thay thế lược đồ bảng của bạn bằng YOU_TABLE_SCHEME;

Thí dụ:

select table_name from information_schema.tables where table_schema='eLearningProject';

Để xem tất cả lược đồ và tất cả các bảng, không cần mệnh đề where:

select table_name from information_schema.tables

1

Một ví dụ một dòng là

\dt schemaname.* 

trong senario của bạn

\dt public.*

0

Điều này có thể được sử dụng trong các tập lệnh tự động hóa nếu bạn không cần tất cả các bảng trong tất cả các lược đồ:

  for table in $(psql -qAntc '\dt' | cut -d\| -f2); do
      ...
  done

-3

Bạn có thể gõ \?để lấy thông tin về tất cả các lệnh được hỗ trợ trong psql.

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.