แสดงรายการตารางในสคีมา PostgreSQL


329

เมื่อฉันทำ\dtใน psql ฉันจะได้รับรายชื่อของตารางในสคีมาปัจจุบันเท่านั้น ( publicโดยค่าเริ่มต้น)

ฉันจะรับรายการของตารางทั้งหมดในแบบแผนทั้งหมดหรือแบบแผนเฉพาะได้อย่างไร

คำตอบ:


505

ใน schemas ทั้งหมด:

=> \dt *.*

ในสคีมาเฉพาะ:

=> \dt public.*

เป็นไปได้ที่จะใช้นิพจน์ทั่วไปที่มีข้อ จำกัด บางอย่าง

\dt (public|s).(s|t)
       List of relations
 Schema | Name | Type  | Owner 
--------+------+-------+-------
 public | s    | table | cpn
 public | t    | table | cpn
 s      | t    | table | cpn

ผู้ใช้ขั้นสูงสามารถใช้การแสดงผลปกติเช่นคลาสตัวอักษรเช่น [0-9] เพื่อจับคู่ตัวเลขใด ๆ ทุกตัวอักษรพิเศษแสดงออกปกติทำงานตามที่ระบุในมาตรา 9.7.3 ยกเว้น.ที่จะนำมาเป็นตัวคั่นดังกล่าวข้างต้น*ซึ่งจะแปลให้สัญกรณ์แสดงออกปกติ.*, ?ซึ่งจะแปลให้.และ$ที่จะถูกจับคู่ตัวอักษร คุณสามารถเลียนแบบตัวละครในรูปแบบเหล่านี้ที่จำเป็นโดยการเขียน?สำหรับ., (R+|)สำหรับR*หรือสำหรับ(R|) ไม่จำเป็นต้องใช้เป็นอักขระนิพจน์ทั่วไปเนื่องจากรูปแบบต้องตรงกับชื่อทั้งหมดไม่เหมือนกับการตีความปกติของนิพจน์ทั่วไป (ในคำอื่น ๆR?$$ถูกผนวกเข้ากับรูปแบบของคุณโดยอัตโนมัติ) เขียน*ที่จุดเริ่มต้นและ / หรือสิ้นสุดหากคุณไม่ต้องการยึดรูปแบบ โปรดทราบว่าภายในเครื่องหมายอัญประกาศคู่อักขระพิเศษของนิพจน์ทั่วไปทั้งหมดจะสูญเสียความหมายพิเศษและถูกจับคู่อย่างแท้จริง นอกจากนี้อักขระพิเศษนิพจน์ทั่วไปจะจับคู่ตามตัวอักษรในรูปแบบชื่อตัวดำเนินการ (เช่นอาร์กิวเมนต์ของ\do)


6
เพียงแค่\dtเป็น equivolent ไป\dt public.*, ฉันใช่มั้ย?
Frozen Flame

แล้วพูดสองตารางที่เจาะจงใน schema ที่เจาะจงล่ะ ชอบ\dt public.user_info, public.user_scopeไหม
James M. Lay

ไม่เป็นไรมันง่ายกว่าที่จะทำ\dt public.a; \dt public.b;ในบรรทัดเดียว
James M. Lay

มันเป็นความหมายโดยนัย .. หาก \ dt ให้เฉพาะตาราง "สาธารณะ" เราจะไม่คาดหวังอะไรจากการแสดงออกปกติ ..
เมห์เม็ต

1
@ FrozenFlame มันไม่ใช่! โดยค่าเริ่มต้นมันแสดงให้เห็นว่าสิ่งที่อยู่ในของคุณsearch_pathและที่"$user", public.*ค่าเริ่มต้น ดังนั้นเป็นไปได้ที่ตารางรายการทั้งหมดในคีset search_path=s; \dt s
Lukas Juhrich

258

คุณสามารถเลือกตารางจาก information_schema

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

7
มีประโยชน์มากหากส่วนต่อประสานของคุณไม่รองรับทางลัด ขอบคุณ
Matt Bannert

1
สิ่งนี้ก็ดีเช่นกันเพราะคุณสามารถทำบางอย่างเช่นเลือก table_schema, table_name จาก information_schema.tables โดยที่ table_name เช่น '% ก็ตาม%%'; หากคุณจำเป็นต้องรู้ว่าสคีมานั้นอยู่ที่ตารางใดไม่แน่ใจว่าคุณสามารถทำได้ด้วย \ dt
Josh Brown

2
ขอบคุณมันใช้ได้กับ Amazon Redshift และ \ dt (คำตอบที่ยอมรับ) ไม่ได้
Carlos2W

2
นี่เป็นคำตอบที่มีประโยชน์ที่สุด information_schema มีการกำหนดไว้ในมาตรฐาน SQL และมีอยู่ในฐานข้อมูลส่วนใหญ่ที่ปฏิบัติตาม
Davos

54

อีกวิธีหนึ่งที่information_schemaเป็นไปได้ที่จะใช้pg_tables:

select * from pg_tables where schemaname='public';

3
โปรดทราบว่าหากคุณต้องการชื่อตารางเป็นข้อความค้นหาผลลัพธ์SELECT tablename FROM pg_tables WHERE schemaname = 'public';
Grant Humphries

พบปัญหาสิทธิ์ที่information_schemaไม่ได้แสดงรายการจากpublicสคีมา แต่pg_tablesวิธีการทำงานเป็นอย่างดี ขอบคุณมาก!
John Crawford

8

สำหรับผู้ที่พบสิ่งนี้ในอนาคต:

หากคุณต้องการดูรายการความสัมพันธ์สำหรับ schema หลายรายการ:

$psql mydatabase
mydatabase=# SET search_path TO public, usa;   #schema examples
SET
mydatabase=# \dt
              List of relations
 Schema |      Name       | Type  |  Owner
--------+-----------------+-------+----------
 public | counties        | table | postgres
 public | spatial_ref_sys | table | postgres
 public | states          | table | postgres
 public | us_cities       | table | postgres
 usa    | census2010      | table | postgres
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.