Psql แสดงรายการตารางทั้งหมด


125

ฉันต้องการแสดงรายการตารางทั้งหมดในliferayฐานข้อมูลในการติดตั้ง PostgreSQL ของฉัน ฉันจะทำอย่างไร?

ฉันต้องการดำเนินการSELECT * FROM applications;ในliferayฐานข้อมูล applicationsเป็นตารางในชีวิตของฉันเรย์ฐานข้อมูล วิธีนี้ทำได้อย่างไร?

นี่คือรายการฐานข้อมูลทั้งหมดของฉัน:

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=# 

คำตอบ:


203

หากคุณต้องการแสดงรายการตารางทั้งหมดคุณต้องใช้:

\dt *.*

เพื่อแสดงว่าคุณต้องการตารางทั้งหมดในสกีมาทั้งหมด ซึ่งจะรวมถึงตารางในpg_catalogตารางระบบและตารางในinformation_schemaตารางระบบและผู้ที่อยู่ในไม่มีวิธีในตัวที่จะพูดว่า "ทุกตารางในสคีมาที่ผู้ใช้กำหนดเองทั้งหมด" อย่างไรก็ตามคุณสามารถตั้งค่าของคุณsearch_pathไปยังรายการของ schemas \dtทั้งหมดที่น่าสนใจก่อนที่จะใช้

คุณอาจต้องการทำสิ่งนี้โดยใช้โปรแกรมซึ่งในกรณีนี้psqlคำสั่งแบ็กสแลชจะไม่ทำงาน นี่คือที่มาเพื่อช่วยเหลือ ในการแสดงรายการตาราง:INFORMATION_SCHEMA

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

BTW หากคุณต้องการดูว่าpsqlกำลังทำอะไรเพื่อตอบสนองต่อคำสั่งแบ็กสแลชให้รันpsqlด้วย-Eแฟล็ก เช่น:

$ 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;
**************************

เพื่อให้คุณเห็นว่าpsqlกำลังค้นหาpg_catalog.pg_databaseเมื่อได้รับรายการฐานข้อมูล ในทำนองเดียวกันสำหรับตารางภายในฐานข้อมูลที่กำหนด:

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;

ควรใช้มาตรฐาน SQL แบบพกพาINFORMATION_SCHEMAแทนแค็ตตาล็อกระบบ Pg หากเป็นไปได้ แต่บางครั้งคุณต้องการข้อมูลเฉพาะของ Pg ในกรณีดังกล่าวคุณควรสอบถามแคตตาล็อกระบบโดยตรงและpsql -Eอาจเป็นคำแนะนำที่เป็นประโยชน์สำหรับวิธีดำเนินการดังกล่าว


information_schema.tablesรวมการดูด้วยเหตุผลบางประการ (ใน PostgreSQL 9.2 อย่างไรก็ตาม)
jpmc26

@ jpmc26 ใช่ด้วยtable_type = 'VIEW'ดังนั้นจึงง่ายต่อการยกเว้น โดยทั่วไป SQL พยายามที่จะปฏิบัติต่อมุมมองเหมือนกับตารางให้มากที่สุด
Craig Ringer

94

เชื่อมต่อกับฐานข้อมูลจากนั้นแสดงรายการตาราง:

\c liferay
\dt

นั่นคือวิธีที่ฉันทำต่อไป

คุณสามารถรวมสองคำสั่งนี้ไว้ในบรรทัดเดียวได้หากต้องการ:

\c liferay \dt

2
คุณต้องการจริงๆ\dt *.*ถ้าตารางที่น่าสนใจทั้งหมดไม่ได้อยู่ในไฟล์search_path.
Craig Ringer

10

หากต้องการดูตารางสาธารณะคุณสามารถทำได้

ตารางรายการ

\dt

ตารางรายการดูและสิทธิ์การเข้าถึง

\dp or \z

หรือเพียงแค่ชื่อตาราง

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

2

ใน SQL Query คุณสามารถเขียนโค้ดนี้:

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

แทนที่โครงร่างตารางของคุณด้วย YOUR_TABLE_SCHEME;

ตัวอย่าง:

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

หากต้องการดูโครงร่างทั้งหมดและตารางทั้งหมดไม่จำเป็นต้องมีคำสั่ง where:

select table_name from information_schema.tables


0

สิ่งนี้สามารถใช้ในสคริปต์อัตโนมัติหากคุณไม่ต้องการตารางทั้งหมดในสกีมาทั้งหมด:

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

-3

คุณสามารถพิมพ์\?เพื่อรับข้อมูลเกี่ยวกับคำสั่งทั้งหมดที่รองรับใน psql

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.