ฉันจะแสดงรายการคอลัมน์ทั้งหมดสำหรับตารางที่ระบุได้อย่างไร


292

ฉันกำลังมองหาข้อมูลที่แม่นยำในฐานข้อมูลซึ่งฉันไม่มีความรู้

มันเป็นผลิตภัณฑ์ของบุคคลที่สามพวกเขาตอบคำถามช้าและฉันรู้ว่าข้อมูลอยู่ในฐานข้อมูลนั้นดังนั้นฉันต้องการวิศวกรรมย้อนยุคเล็กน้อย

ให้หนึ่งตารางมันเป็นไปได้ที่จะมีรายชื่อของคอลัมน์สำหรับตารางนี้หรือไม่?

ตัวอย่างเช่นใน SqlServer เป็นไปได้ที่จะดัมพ์ตารางลงในCREATEคำสั่งที่ใช้ซ้ำได้ซึ่งแสดงรายการคอลัมน์ทั้งหมดที่ตารางประกอบด้วยข้อความ


การเข้าถึงแบบไหนที่คุณมีต่อ DB?
dezso

@dezso มันอยู่ในเครื่องที่แยกออกจากกัน แต่ฉันสามารถเข้าสู่ระบบและเปิดบรรทัดคำสั่ง psql ด้วยสิทธิ์ของผู้ดูแลระบบ
Stephane Rolland

6
ถ้าฉันเข้าใจคุณอย่างถูกต้องคุณก็\dt[+] table_nameเข้าpsqlมา
dezso

1
Nope \ dt + ดูเหมือนจะไม่แสดงชื่อคอลัมน์อย่างชัดเจน มันจะเพิ่มเพียงฟิลด์ "คำอธิบาย"
Stephane Rolland

12
แต่ \ d + ชื่อตารางใช้งานได้!
Stephane Rolland

คำตอบ:


344

นอกเหนือจากบรรทัดคำสั่งที่\d+ <table_name>คุณพบแล้วคุณสามารถใช้โครงสร้างข้อมูลเพื่อค้นหาข้อมูลคอลัมน์โดยใช้information_schema.columns:

SELECT *
  FROM information_schema.columns
 WHERE table_schema = 'your_schema'
   AND table_name   = 'your_table'
     ;

หมายเหตุ: ตามตัวอย่างด้านบนตรวจสอบให้แน่ใจว่าค่านั้นอยู่ในเครื่องหมายคำพูด


2
ใน psql ให้ใช้\x onหรือ\pset expanded onสร้างผลลัพธ์แบบสอบถามเป็นเส้นตรง (แทนที่จะเป็นแบบตาราง) และง่ายต่อการอ่านstackoverflow.com/a/9605093/513397
anishpatel

4
ในเวอร์ชันปัจจุบัน (ลองใช้ใน 9.6) คุณสามารถทำใน psql \d+ public.*เพื่อรับรายละเอียด (schema + indeces / fkeys / triggers) ของตารางและมุมมองทั้งหมดในpublicschema เราใช้มันในสคริปต์เบ็ดล่วงหน้าของเราเพื่อติดตามในส่วนของการเปลี่ยนแปลงในฐานข้อมูลที่ทำโดยแต่ละกระทำ
Thalis K.

4
เลือก column_name เพื่อรับชื่อคอลัมน์เท่านั้น
แอนดรูว์

82

ในฐานะที่เป็นส่วนเสริมของคำตอบอื่น ๆ แม้แต่คำสั่ง SELECT ที่ส่งคืนแถวจะไม่เปิดเผยชื่อคอลัมน์ให้คุณและรหัสแอปพลิเคชัน

select *
from table_name
where false;

สิทธิ์อาจเข้ามาเล่นด้วยวิธีการใด ๆ เหล่านี้


ฉันคิดว่าคุณหมายถึงการส่ง SQL นี้ไปยังคำสั่ง psql ฉันขอแนะนำให้ใช้ตัวเลือก --no-psqlrc ในกรณีนั้นเพื่อหลีกเลี่ยงความประหลาดใจในผลลัพธ์
JohnMudd

ยกเว้นสำหรับคอลัมน์ที่ซ่อนอยู่ซึ่งจะต้องมีการระบุที่ได้รับเลือก (เช่น pg_class.oid)
okutane

71

สคีข้อมูลเป็นวิธีที่ช้าและแน่ใจว่ามันเป็นมาตรฐานและส่วนใหญ่จะพกพาไปยังฐานข้อมูลอื่น ๆ ที่สนับสนุนมัน และมันจะทำงานต่อไปในเวอร์ชันหลัก ๆ

อย่างไรก็ตามมุมมองในสคีมาข้อมูลมักจะเข้าร่วมในตารางจำนวนมากจากแคตตาล็อกระบบเพื่อให้ตรงกับรูปแบบที่ได้มาตรฐานอย่างเข้มงวดซึ่งส่วนใหญ่เป็นค่าขนส่งที่ตายแล้วเกือบตลอดเวลา ซึ่งทำให้พวกเขาช้า
นักพัฒนา Postgres ไม่ได้ให้คำมั่นสัญญา แต่พื้นฐาน (เช่นเดียวกับสิ่งที่ต้องการในที่นี้) จะไม่เปลี่ยนแปลงในเวอร์ชันหลัก

psql(อินเตอร์เฟสบรรทัดรับคำสั่งดั้งเดิม) ใช้ช่องทางที่รวดเร็วแน่นอนและค้นหาแหล่งข้อมูลโดยตรง หากคุณเริ่มต้นpsqlด้วยพารามิเตอร์-E SQL หลังคำสั่งแบ็กสแลชเช่น\dจะปรากฏขึ้น หรือ\set ECHO_HIDDEN onจากบรรทัดคำสั่ง psql เริ่มจากตรงนั้นคุณสามารถสร้างคำตอบสำหรับคำถามของคุณ

ให้หนึ่งตารางมันเป็นไปได้ที่จะมีรายชื่อของคอลัมน์สำหรับตารางนี้

SELECT attrelid::regclass AS tbl
     , attname            AS col
     , atttypid::regtype  AS datatype
       -- more attributes?
FROM   pg_attribute
WHERE  attrelid = 'myschema.mytable'::regclass  -- table name, optionally schema-qualified
AND    attnum > 0
AND    NOT attisdropped
ORDER  BY attnum;

เร็วกว่าการสอบถาม information_schema.columnsลองEXPLAIN ANALYZEดูด้วยตัวคุณเอง ยังไม่ค่อยสำคัญสำหรับการค้นหาครั้งเดียว แต่อาจสร้างความแตกต่างหากใช้ในแบบสอบถาม / ฟังก์ชันที่ทำซ้ำหลายครั้ง

นอกจากนี้ยังมีความแตกต่างเล็กน้อยในการมองเห็น เปรียบเทียบรายละเอียด:


2
ชอบที่คุณแสดงให้คุณเห็น-Eและแสดงให้คนอื่นเห็นวิธีรับ sql ของ psql
Evan Carroll

6

psql บน PostgreSQL 11+

หากคุณกำลังมองหาประเภทคอลัมน์ในแบบสอบถามคุณสามารถใช้psql's\gdesc

SELECT
    NULL AS zero,
    1 AS one,
    2.0 AS two,
    'three' AS three,
    $1 AS four,
    sin($2) as five,
    'foo'::varchar(4) as six,
    CURRENT_DATE AS now
\gdesc
 Column |         Type         
--------+----------------------
 zero   | text
 one    | integer
 two    | numeric
 three  | text
 four   | text
 five   | double precision
 six    | character varying(4)
 now    | date
(8 rows)

0

PostgreSQL เท่านั้น

นี่ค่อนข้างจะไม่ค่อยสำคัญ แต่อาจเป็นคู่แข่งถ้าคุณกำลังมองหา SQL ที่สั้นที่สุดเท่าที่จะเป็นไปได้:

SELECT json_object_keys(to_json(json_populate_record(NULL::schema_name.table_name, '{}'::JSON)))

หรือสั้นกว่า (สมมติว่ามีแถวอย่างน้อยหนึ่งแถวในตาราง)

SELECT json_object_keys(to_json((SELECT t FROM schema_name.table_name t LIMIT 1)))

รายการรักษาคำสั่ง ในกรณีที่คุณไม่สนใจเกี่ยวกับการสั่งซื้อและมีการhstoreติดตั้งส่วนขยายคุณสามารถทำได้สั้นลง

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