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


292

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 gì về nó.

Đâ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 CREATEcâu lệnh có thể sử dụng lại , nó liệt kê một cách chính thức tất cả các cột mà bảng được cấu thành.


Bạn có quyền truy cập nào vào DB?
dezso

@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
Stephane Rolland

6
Nếu tôi hiểu bạn một cách chính xác, bạn đang sau \dt[+] table_nametrong psql.
dezso

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ả".
Stephane Rolland

12
nhưng \ d + tên bảng hoạt động!
Stephane Rolland

Câu trả lời:


344

Ngoài dòng lệnh \d+ <table_name>bạn đã tìm thấy, bạn cũng có thể sử dụng Lược đồ thông tin để 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.


2
Trong psql, sử dụng \x onhoặc \pset expanded onđể tạo kết quả truy vấn tuyến tính (thay vì dạng bảng) và do đó dễ đọc stackoverflow.com/a/9605093/513397
anishpatel

4
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+ public.*để 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 publiclược đồ. 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.
Thalis K.

4
CHỌN cột_name để chỉ lấy tên cột
Andrew

82

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ể đi kèm với bất kỳ phương pháp tiếp cận nào.


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.
JohnMudd

Ngoại trừ các cột ẩn, phải được chỉ định để được chọn (như pg_group.oid)
okutane

71

Các giản đồ thông tin là cách chậm chạp và chắc chắn: đó là tiêu chuẩn hóa và phần lớn di động để cơ sở dữ liệu khác 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, các khung nhìn trong lược đồ thông tin thường tham gia vào nhiều bảng từ danh mục hệ thống để đáp ứng một định dạng được chuẩn hóa nghiêm ngặt - nhiều trong số đó chỉ là vận chuyển hàng hóa trong hầu hết thời gian. Đ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) dĩ nhiên có làn đường nhanh và truy vấn trực tiếp nguồn. Nếu bạn bắt đầu psqlvới tham số-E , SQL đằng sau các lệnh dấu gạch chéo ngược \dđược hiển thị. Hoặc \set ECHO_HIDDEN ontừ 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 truy vấninformation_schema.columns . Hãy thử EXPLAIN ANALYZExem cho chính mình. Vẫn hầu như không quan trọng cho 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:


2
Thực sự như thế bạn chỉ cho bạn -Evà chỉ cho mọi người làm thế nào để có được sql của psql.
Evan Carroll

6

psql trên PostgreSQL 11+

Nếu bạn đang tìm kiếm các loại cột trên một truy vấn, bạn có thể sử dụng 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

Chỉ có PostgreSQL

Điều này hơi khó khăn nhưng có thể là một ứng cử viên nếu bạn đang tìm kiếm SQL ngắn nhất có thể:

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

hoặc thậm chí ngắn hơn (giả sử có ít nhất một hàng có trong bảng)

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

Danh sách bảo tồn thứ tự. Trong trường hợp bạn không quan tâm đến đơn hàng và đã hstorecài đặt tiện ích mở rộng, bạn có thể thực hiện thậm chí ngắn hơn

SELECT skeys(hstore(NULL::schema_name.table_name))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.