Câu hỏi PostgreSQL “MÔ TẢ DESCRIBE”


Làm thế nào để bạn thực hiện tương đương với Oracle DESCRIBE TABLE trong PostgreSQL (sử dụng lệnh psql)?


1482
2017-09-20 20:47


gốc




Các câu trả lời:


Hãy thử điều này (trong psql công cụ dòng lệnh):

\d+ tablename

Xem hướng dẫn để biết thêm thông tin.


2278
2017-09-20 20:50



Ban đầu tôi đã chấp nhận câu trả lời của devinmoore nhưng tôi thực sự thích câu trả lời này tốt hơn. Nó không chỉ mô tả bảng mà còn hiển thị siêu dữ liệu như mô tả cột và nếu có bất kỳ OID nào. - Mr. Muskrat
Các + thực sự là ly hợp, vì PostgresSQL 9 chỉ cung cấp mô tả chuyên sâu cho các chế độ xem khi bạn thực hiện \d+ table_name, thay vì đơn giản \d table_name - nessur
\ d không hoạt động khi bạn gọi nó trong PosgreSQL 9.1 thông qua pgAdmin, câu trả lời của Vinko dưới đây có thể áp dụng cho nhiều trường hợp hơn - hello_earth
psql -E là tiện dụng để có được sql thực hiện \d+ và tương tự (để sử dụng bên ngoài dấu nhắc lệnh psql) - bsb
Lỗi: "không tìm thấy bất kỳ mối quan hệ nào có tên". Điều này có nghĩa là bạn cần bọc tên bảng của bạn trong dấu ngoặc kép. Rõ ràng, postgres sẽ thấp hơn trường hợp tên bảng của bạn mà không có chúng và do đó không tìm thấy bảng của bạn. Hy vọng điều này sẽ giúp bất cứ ai khác đến đây và có vấn đề này. :) - amurrell


Ngoài cách PostgreSQL (\ d 'một cái gì đó' hoặc \ dt 'bảng' hoặc \ ds 'trình tự' và vv)

Cách tiêu chuẩn SQL, như được hiển thị đây:

select column_name, data_type, character_maximum_length
from INFORMATION_SCHEMA.COLUMNS where table_name = '<name of table>';

Nó được hỗ trợ bởi nhiều công cụ db.


571
2017-09-20 20:51



chọn column_name, data_type, character_maximum_length từ INFORMATION_SCHEMA.COLUMNS trong đó table_name = 'table'; - Dr. Person Person II
Điều này hữu ích hơn \ d khi bạn bị mắc kẹt với một pre-8.4 psql và một máy chủ sau 8.4 - lệnh \ d không tương thích. - beldaz
Lệnh này cũng chạy với RedShift, ở đây \d+không làm. Đây là câu trả lời hay nhất IMO - New Alexandria
Tuyệt vời, tôi cũng nên thêm tên lược đồ cho bưu điện - amenadiel
\ d, \ d + không hoạt động từ Navicat. Truy vấn nhỏ này là đủ tốt! Điều này đáng lẽ phải là câu trả lời! - Kumar Vaibhav


Nếu bạn muốn lấy nó từ truy vấn thay vì psql, bạn có thể truy vấn lược đồ danh mục. Đây là một truy vấn phức tạp thực hiện điều đó:

SELECT  
    f.attnum AS number,  
    f.attname AS name,  
    f.attnum,  
    f.attnotnull AS notnull,  
    pg_catalog.format_type(f.atttypid,f.atttypmod) AS type,  
    CASE  
        WHEN p.contype = 'p' THEN 't'  
        ELSE 'f'  
    END AS primarykey,  
    CASE  
        WHEN p.contype = 'u' THEN 't'  
        ELSE 'f'
    END AS uniquekey,
    CASE
        WHEN p.contype = 'f' THEN g.relname
    END AS foreignkey,
    CASE
        WHEN p.contype = 'f' THEN p.confkey
    END AS foreignkey_fieldnum,
    CASE
        WHEN p.contype = 'f' THEN g.relname
    END AS foreignkey,
    CASE
        WHEN p.contype = 'f' THEN p.conkey
    END AS foreignkey_connnum,
    CASE
        WHEN f.atthasdef = 't' THEN d.adsrc
    END AS default
FROM pg_attribute f  
    JOIN pg_class c ON c.oid = f.attrelid  
    JOIN pg_type t ON t.oid = f.atttypid  
    LEFT JOIN pg_attrdef d ON d.adrelid = c.oid AND d.adnum = f.attnum  
    LEFT JOIN pg_namespace n ON n.oid = c.relnamespace  
    LEFT JOIN pg_constraint p ON p.conrelid = c.oid AND f.attnum = ANY (p.conkey)  
    LEFT JOIN pg_class AS g ON p.confrelid = g.oid  
WHERE c.relkind = 'r'::char  
    AND n.nspname = '%s'  -- Replace with Schema name  
    AND c.relname = '%s'  -- Replace with table name  
    AND f.attnum > 0 ORDER BY number
;

Nó khá phức tạp nhưng nó cho bạn thấy sức mạnh và tính linh hoạt của danh mục hệ thống PostgreSQL và sẽ giúp bạn trên đường đến pg_catalog mastery ;-). Hãy chắc chắn thay đổi% s trong truy vấn. Đầu tiên là Schema và thứ hai là tên bảng.


53
2017-09-22 23:39



Truy vấn này được hiển thị tốt hơn đây lưu ý rằng họ cũng đề xuất "\ d bảng" - Flavien Volken
Một ưu điểm của giải pháp này là format_type() sẽ bao gồm bất kỳ công cụ sửa đổi nào được đính kèm theo loại, ví dụ: numeric(6,2); trong khi information_schema.columns sẽ chỉ báo cáo loại cơ sở numeric. - Eli Collins
Làm cách nào để tách loại dữ liệu khỏi kích thước? nói | ký tự thay đổi (50) | tới 2 cột: | nhân vật khác nhau | 50 | - ivanceras


Bạn có thể làm điều đó với lệnh psql slash:

 \d myTable describe table

Nó cũng hoạt động cho các đối tượng khác:

 \d myView describe view
 \d myIndex describe index
 \d mySequence describe sequence

Nguồn: faqs.org


45
2017-09-20 20:49





Tương đương psql DESCRIBE TABLE Là \d table.

Xem phần psql của hướng dẫn sử dụng PostgreSQL để biết thêm chi tiết.


31
2017-09-20 20:49



Ngoài ra, cơ sở dữ liệu psql selction là \c databasename thay vì use databasename (đối với những người đến từ MySQL như bản thân mình :-). Không có \c databasename Đầu tiên, \d tablename sản xuất No relations found. và không có gì nữa. - Ville


Bạn có thể làm một \d *search pattern *  có dấu hoa thị để tìm các bảng phù hợp với mẫu tìm kiếm mà bạn quan tâm.


20
2018-05-30 16:20



Đây là những gì tôi đang tìm kiếm - cách mô tả tập hợp con các bảng. Lưu ý, tôi cũng thấy rằng nếu các bảng của bạn có chữ hoa, thì cú pháp là \d *"<SubString>"*. Tức là, dấu ngoặc kép phải là phía trong dấu hoa thị. Mặc dù, nếu bạn chỉ muốn danh sách của các bảng sau đó bạn muốn sử dụng \dt - Randall
điều này khớp với chuỗi và chỉ mục cũng như các bảng - easl


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 info_schema.columns 

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

12
2018-02-25 08:03



FROM info_schema.columns đã không làm việc cho tôi, tôi đã phải sử dụng from information_schema.columns, không chắc đó có phải là lỗi đánh máy trong câu trả lời của bạn hay một số vấn đề triển khai ở phần cuối của tôi không. - user27874


Bạn có thể sử dụng điều này:

SELECT attname 
FROM pg_attribute,pg_class 
WHERE attrelid=pg_class.oid 
AND relname='TableName' 
AND attstattarget <>0; 

11
2017-12-05 18:55



Điều này cũng làm việc cho các bảng tạm thời. - Manu CJ


Sử dụng câu lệnh SQL sau

SELECT DATA_TYPE 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE table_name = 'tbl_name' 
AND COLUMN_NAME = 'col_name'

Nếu bạn thay thế tbl_name và col_name, nó sẽ hiển thị kiểu dữ liệu của coloumn cụ thể mà bạn đang tìm kiếm.


9
2018-05-05 08:00



Đó là gì câu trả lời này từ năm 2008 nói. - Quentin
@ Quentin-Có sự khác biệt trong cả hai .. Giải pháp trên 2008 mô tả column_name, data_type, character_maximum_length cho toàn bộ bảng. Ở đâu như của tôi - giải pháp được đề cập - chỉ hiển thị kiểu dữ liệu của cột lược đồ. Chạy cả hai và kiểm tra. Cả hai đều khác nhau. Tất cả các giải pháp ở đây là những cách khác nhau để giải quyết vấn đề. Người dùng có thể sử dụng điều này vì các lý do khác nhau - Mr.Tananki


Biến thể này của truy vấn (như được giải thích trong các câu trả lời khác) đã làm việc cho tôi.

SELECT
 COLUMN_NAME
FROM
 information_schema.COLUMNS
WHERE
 TABLE_NAME = 'city';

Nó được mô tả ở đây chi tiết: http://www.postgresqltutorial.com/postgresql-describe-table/


5
2018-02-14 13:46