Làm cách nào để liệt kê tất cả các cột cho một bảng được chỉ định


158

Tôi đang tìm kiếm một mẩu thông tin chính xác trong cơ sở dữ liệu mà tôi không biết.

Đây là sản phẩm của bên thứ 3, họ chậm trả lời một số câu hỏi và tôi biết dữ liệu nằm trong db đó, vì vậy tôi muốn làm một chút về kỹ thuật retro.

Cho một bảng, có thể có một danh sách các tên của các cột cho bảng này không?

Ví dụ: trong SqlServer, có thể kết xuất một bảng vào một câu lệnh CREATE có thể sử dụng lại, liệt kê một cách chính xác tất cả các cột mà bảng được tạo thành.

  0

Bạn có quyền truy cập nào vào DB? 13 aug. 122012-08-13 12:49:57

  0

@dezso, nó nằm trên một máy riêng biệt, nhưng tôi có thể đăng nhập vào nó và khởi chạy dòng lệnh psql, với quyền quản trị viên 13 aug. 122012-08-13 12:54:37

+4

Nếu tôi hiểu bạn một cách chính xác, bạn sẽ theo sau '\ dt [+] table_name' trong' psql'. 13 aug. 122012-08-13 13:03:09

+1

không\ dt + dường như không hiển thị rõ ràng tên cột.nó chỉ thêm một trường "Mô tả". 13 aug. 122012-08-13 13:16:51

+7

nhưng \ d + tên bảng hoạt động! 13 aug. 122012-08-13 13:18:12

197

Ngoài dòng lệnh \d+ bạn đã tìm thấy, bạn cũng có thể sử dụng Information Schema để tra cứu dữ liệu cột, sử dụng information_schema.columns :

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

Lưu ý: Theo ví dụ trên, đảm bảo các giá trị được đặt trong dấu ngoặc kép.

  0

Trong psql, sử dụng '\ x on' hoặc' \ pset được mở rộng trên' để biến kết quả truy vấn thành tuyến tính (thay vì dạng bảng) và do đó dễ đọc hơn https://stackoverflow.com/a/9605093/513397 07 sep. 172017-09-07 22:46:06

+1

Trong các phiên bản hiện tại (đã thử trong 9.6), bạn có thể thực hiện trong psql '\ d + công khai. *' Để lấy mô tả (lược đồ + indeces/fkeys/kích hoạt) của tất cả các bảng và dạng xem của bạn trong lược đồ 'công khai.Chúng tôi sử dụng nó trong tập lệnh hook pre-commit để theo dõi các thay đổi trong DB được thực hiện bởi mỗi lần xác nhận. 23 oct. 172017-10-23 18:30:47

+1

CHỌN cột_name để chỉ lấy tên cột 22 feb. 182018-02-22 16:56:14


54

information schema là cách chậm và chắc chắn: nó được chuẩn hóa và phần lớn có thể di chuyển đến các cơ sở dữ liệu khác hỗ trợ nó.Và nó sẽ tiếp tục hoạt động trên các phiên bản chính.

Tuy nhiên,lượt xemtrong lược đồ thông tin thường tham gia vào nhiều bảng từ system catalogs để đáp ứng một định dạng được chuẩn hóa nghiêm ngặt - nhiều trong số đó hầu hết chỉ là vận chuyển hàng hóa.Điều này làm cho họchậm.
Các nhà phát triển Postgres không đưa ra lời hứa, nhưng những điều cơ bản (như những gì cần thiết ở đây) sẽ không thay đổi trên các phiên bản chính.

psql (giao diện dòng lệnh gốc) tất nhiên có làn đường nhanh và truy vấn trực tiếp nguồn.Nếu bạn bắt đầu psql with the parameter -E , SQL đằng sau các lệnh dấu gạch chéo ngược như \d được hiển thị.Hoặc \set ECHO_HIDDEN on từ dòng lệnh psql.Bắt đầu từ đó bạn có thể xây dựng một câu trả lời cho câu hỏi của bạn.

Cho một bảng, có thể có một danh sách các tên của các cột cho bảng này.

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;

Nhanh hơn querying information_schema.columns .Hãy thử EXPLAIN ANALYZE để xem cho chính mình.Vẫn hầu như không quan trọng đối với việc tìm kiếm một lần.Nhưng có thể tạo sự khác biệt nếu được sử dụng trong truy vấn/hàm được lặp lại nhiều lần.

Ngoài ra còn có sự khác biệt tinh tế trong tầm nhìn.So sánh chi tiết:

+1

Thực sự thích điều đó, bạn chỉ cho bạn '-E' và chỉ cho mọi người cách lấy sql của psql. 02 dec. 162016-12-02 20:31:40


52

Là một bổ sung cho các câu trả lời khác, ngay cả một câu lệnh CHỌN không trả về hàng nào sẽ hiển thị tên cột cho bạn và mã ứng dụng.

select *
from table_name
where false;

Quyền có thể có hiệu lực với bất kỳ phương pháp nào trong số này.

  0

nhanh chóng và dễ dàngcâu trả lời tốt nhất nếu tôi chỉ cần xem một danh sách các cột. 26 jan. 172017-01-26 18:23:54

  0

Tôi đoán bạn có nghĩa là truyền SQL này cho lệnh psql.Tôi đề nghị sử dụng tùy chọn --no-psqlrc trong trường hợp đó để tránh những bất ngờ ở đầu ra. 09 mar. 172017-03-09 19:37:28

  0

Tốt nhất, nhanh chóng và dễ dàng 04 dec. 172017-12-04 10:31:13

  0

Đây là thiên tài !! 01 feb. 182018-02-01 10:07:26