PostgreSQL แบบสอบถามเพื่อแสดงรายการชื่อตารางทั้งหมด?


184

มีแบบสอบถามใด ๆ หรือไม่ที่จะแสดงรายการตารางทั้งหมดในฐานข้อมูล Postgres ของฉัน

ฉันลองใช้หนึ่งคำถามเช่น:

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

แต่แบบสอบถามนี้ส่งคืนมุมมองด้วย

ฉันจะได้รับเฉพาะชื่อตารางเท่านั้นไม่ใช่มุมมองได้อย่างไร

คำตอบ:


307

สิ่งที่เกี่ยวกับแบบสอบถามนี้ (ขึ้นอยู่กับคำอธิบายจากคู่มือ )?

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

4
นี่คือคำตอบที่ดีที่สุดที่นี่
ทอมมี่

3
ประเภทโต๊ะคืออะไร?
ไบรอัน Bryce

table_type จากคู่มือ: ประเภทของตาราง: BASE TABLE สำหรับตารางฐานถาวร (ชนิดตารางปกติ), VIEW สำหรับมุมมอง, FOREIGN สำหรับตารางต่างประเทศหรือ LOCAL TEMPORARY สำหรับตารางชั่วคราว
tzachs

38

หากคุณต้องการรายชื่อฐานข้อมูล

SELECT datname FROM pg_database WHERE datistemplate = false;

หากคุณต้องการรายชื่อของตารางจากการติดตั้ง pg ปัจจุบันของฐานข้อมูลทั้งหมด

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

อย่างน้อยใน Postgres 9.5 นั่นไม่ใช่ความจริง ฉันมี 3 ฐานข้อมูลในหนึ่งคลัสเตอร์และนี่เป็นเพียงการส่งคืนตารางจากฐานข้อมูลปัจจุบัน
sudo

เอกสารบอกว่าปัจจุบันเท่านั้น: postgresql.org/docs/9.5/static/infoschema-tables.html "table_catalog sql_identifier ชื่อของฐานข้อมูลที่มีตาราง (ฐานข้อมูลปัจจุบันเสมอ)"
sudo

28

เปิด terminal postgres ด้วย databse ที่คุณต้องการ:

psql dbname (run this line in a terminal)

จากนั้นรันคำสั่งนี้ในสภาพแวดล้อม postgres

\d

สิ่งนี้จะอธิบายตารางทั้งหมดตามชื่อ โดยทั่วไปรายการของตารางตามชื่อจากน้อยไปมาก

จากนั้นคุณสามารถลองใช้วิธีนี้เพื่ออธิบายตารางตามเขตข้อมูล:

\d tablename.

หวังว่านี่จะช่วยได้


@wingedpanther ทำอย่างไร? มี\dตัวเลือกในการแสดงรายการ เฉพาะตารางทั้งหมดโดยไม่มีดัชนีไม่มี seq, ... ?
Peter Krauss

5
คือ\dtไม่ได้มีสำหรับนี้หรือไม่?
thoroc

11

ลองสิ่งนี้:

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

อันนี้ใช้งานได้!


table_type='BASE TABLE'ผมไม่คิดว่าเราต้อง บางทีฉันผิดคุณช่วยอธิบายเพิ่มเติมหน่อยได้ไหม?
abriggs

บางครั้งมีประโยชน์ในการกรองการเพิ่มฐานข้อมูลที่เชื่อมต่อปัจจุบัน: และ table_catalog = current_database ()
Diego Scaravaggi

8
select 
 relname as table 
from 
 pg_stat_user_tables 
where schemaname = 'public'
  • สิ่งนี้จะไม่ทำงานหากtrack_activitiesถูกปิดใช้งาน

select 
  tablename as table 
from 
  pg_tables  
where schemaname = 'public'
  • อ่านเพิ่มเติมเกี่ยวกับpg_tables

1
pg_stat_user_tablesอาจไม่ได้รับการเติมหากtrack_activitiesปิดการใช้งาน การใช้ "อย่างเป็นทางการ" API เช่นpg_tablesหรือinformation_schema.tableเป็นมากเลือกที่ดีกว่า
a_horse_with_no_name


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

สำหรับ MySQL คุณต้องใช้ table_schema = 'dbName' และสำหรับ MSSQL ให้ลบเงื่อนไขนั้น

โปรดสังเกตว่า "เฉพาะตารางและมุมมองเหล่านั้นเท่านั้นที่แสดงว่าผู้ใช้ปัจจุบันมีสิทธิ์เข้าถึง" นอกจากนี้หากคุณสามารถเข้าถึงฐานข้อมูลจำนวนมากและต้องการ จำกัด ผลลัพธ์ให้กับฐานข้อมูลบางอย่างคุณสามารถทำได้โดยเพิ่มเงื่อนไขและ table_catalog = 'yourDatabase' (ใน PostgreSQL)

หากคุณต้องการกำจัดส่วนหัวที่แสดงชื่อแถวและส่วนท้ายที่แสดงจำนวนแถวคุณสามารถเริ่ม psql ด้วยตัวเลือกบรรทัดคำสั่ง -t (ย่อมาจาก --tuples เท่านั้น) หรือคุณสามารถสลับการตั้งค่าใน psql บรรทัดคำสั่งโดย \ t (ย่อมาจาก \ pset tuples_only) สิ่งนี้อาจเป็นประโยชน์เช่นเมื่อไพพ์เอาต์พุตไปยังคำสั่งอื่นด้วย \ g [| คำสั่ง]

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