BẢNG PostgreSQL BẢNG MÔ TẢ


Câu trả lời:


2820

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

\d+ tablename

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


8
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 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.
Ông Muskrat

27
Đây +thực sự là một bộ ly hợp, vì PostgresQuery 9 chỉ đưa ra mô tả chuyên sâu cho các lượt xem khi bạn thực hiện \d+ table_name, thay vì đơn giản\d table_name
nessur

12
\ 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

12
psql -Erất thuận tiện để có được sql thực hiện \d+và tương tự (để sử dụng bên ngoài dấu nhắc psql)
bsb

17
Lỗi: "không tìm thấy bất kỳ mối quan hệ được đặt tên". Điều này có nghĩa là bạn cần bọc tên của bảng trong dấu ngoặc kép. Rõ ràng, postgres sẽ viết thường 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

742

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

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.


23
chọn cột_name, data_type, character_maximum_length từ THÔNG TIN_SCHema.COLUMNS trong đó tên_bảng = 'bảng';
Tiến sĩ Person Person II

7
Điều này hữu ích hơn \ d khi bạn bị mắc kẹt với máy chủ trước 8.4 và máy chủ sau 8.4 - lệnh \ d không tương thích.
beldaz

26
Ngoài ra lệnh này chạy với RedShift, nơi \d+không. Đây là câu trả lời hay nhất IMO
New Alexandria

6
Thật tuyệt vời, thật tuyệt vời cho những người đăng bài Tôi cũng thêm tên lược đồ
ffflabs

3
Điều này chỉ liệt kê các cột với thông tin tối thiểu. \ d + cung cấp DDL đầy đủ cho bảng bao gồm: mặc định, không có giá trị, giá trị tiếp theo, độ chính xác, khóa chính, khóa ngoại, chỉ mục, kiểm tra các ràng buộc và FK từ các bảng khác.
bradw2k

70

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 tiếp tục làm chủ pg_catalog ;-). 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.


3
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

3
Một lợi thế của giải pháp này là format_type()sẽ bao gồm mọi sửa đổi được gắn vào loại, ví dụ numeric(6,2); trong khi đó information_schema.columnssẽ chỉ báo cáo loại cơ sở của numeric.
Eli Collins

3
Làm cách nào để tách loại dữ liệu khỏi kích thước? nói | thay đổi ký tự (50) | đến 2 cột: | thay đổi nhân vật | 50 |
ivanceras

51

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

 \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


36

Tương đương với psql DESCRIBE TABLE\d table.

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


2
Ngoài ra, lựa chọn cơ sở dữ liệu psql \c databasenamechứ không phải use databasename(đối với những người đến từ MySQL như tôi :-). Không có \c databasenameđầu tiên, \d tablenametạo ra No relations found.thông điệp và không có gì hơn.
Ville

27

Đây sẽ là giải pháp:

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

21

Bạn có thể thực hiện \d *search pattern * với các dấu sao để tìm các bảng khớp với mẫu tìm kiếm mà bạn quan tâm.


Đây là những gì tôi đang tìm kiếm - làm thế nào để mô tả một tập hợp con của 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, cú pháp là \d *"<SubString>"*. Đó là, dấu ngoặc kép phải nằm trong dấu hoa thị. Mặc dù, nếu bạn chỉ muốn danh sách các bảng thì bạn muốn sử dụng\dt
Randall

cái này khớp với các chuỗi và chỉ mục cũng như các bảng

15

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'

9
FROM info_schema.columnsTôi đã không sử dụng from information_schema.columns, tôi không sử dụng , không chắc đó là lỗi chính tả trong câu trả lời của bạn hay vấn đề thực hiện nào đó ở cuối.
dùng27874

14

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ị loại dữ liệu của coloumn cụ thể mà bạn đang tìm kiếm.


3
Đó là những gì câu trả lời từ năm 2008 nói.
Quentin

@ Quentin - Có sự khác biệt ở cả hai người .. Giải pháp 2008 ở trên mô tả cột_name, data_type, character_maximum_length cho toàn bộ bảng. Trường hợp 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 một vấn đề. Người dùng có thể sử dụng điều này vì những lý do khác nhau
Mr.Tananki

14

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; 


7

Trong MySQL , MÔ TẢ tên_bảng


Trong PostgreSQL , \ d tên_bảng


Hoặc, bạn có thể sử dụng lệnh dài này:

SELECT
        a.attname AS Field,
        t.typname || '(' || a.atttypmod || ')' AS Type,
        CASE WHEN a.attnotnull = 't' THEN 'YES' ELSE 'NO' END AS Null,
        CASE WHEN r.contype = 'p' THEN 'PRI' ELSE '' END AS Key,
        (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid), '\'(.*)\'')
                FROM
                        pg_catalog.pg_attrdef d
                WHERE
                        d.adrelid = a.attrelid
                        AND d.adnum = a.attnum
                        AND a.atthasdef) AS Default,
        '' as Extras
FROM
        pg_class c 
        JOIN pg_attribute a ON a.attrelid = c.oid
        JOIN pg_type t ON a.atttypid = t.oid
        LEFT JOIN pg_catalog.pg_constraint r ON c.oid = r.conrelid 
                AND r.conname = a.attname
WHERE
        c.relname = 'tablename'
        AND a.attnum > 0

ORDER BY a.attnum

7

Để cải thiện truy vấn SQL của câu trả lời khác (rất tuyệt!), Đây là truy vấn được sửa đổi. Nó cũng bao gồm tên ràng buộc, thông tin thừa kế và các loại dữ liệu được chia thành các phần cấu thành của nó (loại, chiều dài, độ chính xác, tỷ lệ). Nó cũng lọc ra các cột đã bị loại bỏ (vẫn còn tồn tại trong cơ sở dữ liệu).

SELECT
    n.nspname as schema,
    c.relname as table,
    f.attname as column,  
    f.attnum as column_id,  
    f.attnotnull as not_null,
    f.attislocal not_inherited,
    f.attinhcount inheritance_count,
    pg_catalog.format_type(f.atttypid,f.atttypmod) AS data_type_full,
    t.typname AS data_type_name,
    CASE  
        WHEN f.atttypmod >= 0 AND t.typname <> 'numeric'THEN (f.atttypmod - 4) --first 4 bytes are for storing actual length of data
    END AS data_type_length, 
    CASE  
        WHEN t.typname = 'numeric' THEN (((f.atttypmod - 4) >> 16) & 65535)
    END AS numeric_precision,   
    CASE  
        WHEN t.typname = 'numeric' THEN ((f.atttypmod - 4)& 65535 )
    END AS numeric_scale,       
    CASE  
        WHEN p.contype = 'p' THEN 't'  
        ELSE 'f'  
    END AS is_primary_key,  
    CASE
        WHEN p.contype = 'p' THEN p.conname
    END AS primary_key_name,
    CASE  
        WHEN p.contype = 'u' THEN 't'  
        ELSE 'f'
    END AS is_unique_key,
    CASE
        WHEN p.contype = 'u' THEN p.conname
    END AS unique_key_name,
    CASE
        WHEN p.contype = 'f' THEN 't'
        ELSE 'f'
    END AS is_foreign_key,
    CASE
        WHEN p.contype = 'f' THEN p.conname
    END AS foreignkey_name,
    CASE
        WHEN p.contype = 'f' THEN p.confkey
    END AS foreign_key_columnid,
    CASE
        WHEN p.contype = 'f' THEN g.relname
    END AS foreign_key_table,
    CASE
        WHEN p.contype = 'f' THEN p.conkey
    END AS foreign_key_local_column_id,
    CASE
        WHEN f.atthasdef = 't' THEN d.adsrc
    END AS default_value
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 f.attisdropped = false
    AND n.nspname = '%s'  -- Replace with Schema name  
    AND c.relname = '%s'  -- Replace with table name  
    AND f.attnum > 0 
ORDER BY f.attnum
;

4

Bạn cũng có thể kiểm tra bằng cách sử dụng truy vấn dưới đây

Select * from schema_name.table_name limit 0;

Expmple: Bảng của tôi có 2 cột tên và pwd. Đưa ra ảnh chụp màn hình dưới đây.

Thêm hình ảnh

* Sử dụng PG admin3


bởi vì việc lựa chọn và hy vọng pgadmin sẽ thu được sự chậm chạp trong việc lấy dữ liệu meta không phải là "cách thực hành tốt nhất"
Mickey Perlstein

2

Cách tốt nhất để mô tả một bảng như cột, loại, bổ nghĩa của cột, v.v.

\d+ tablename or \d tablename

1
Use this command 

\d table name

like 

\d queuerecords

             Table "public.queuerecords"
  Column   |            Type             | Modifiers
-----------+-----------------------------+-----------
 id        | uuid                        | not null
 endtime   | timestamp without time zone |
 payload   | text                        |
 queueid   | text                        |
 starttime | timestamp without time zone |
 status    | text                        |

1
In postgres \d is used to describe the table structure.
e.g. \d schema_name.table_name;
this command will provide you the basic info of table such as, columns, type and modifiers.

If you want more info about table use
\d+ schema_name.table_name;
this will give you extra info such as, storage, stats target and description

0

1) BẢNG MÔ TẢ PostgreSQL sử dụng psql

Trong công cụ dòng lệnh psql, \ d tên_bảng hoặc \ d + tên_bảng để tìm thông tin trên các cột của bảng

2) BẢNG MÔ TẢ PostgreSQL sử dụng information_schema

Câu lệnh CHỌN để truy vấn cột_names, kiểu dữ liệu, độ dài tối đa ký tự của bảng cột trong cơ sở dữ liệu information_schema;

CHỌN COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH từ Information_SCHema.COLUMNS trong đó tên_bảng = 'tablename';

Để biết thêm thông tin https://www.postgresqltutorial.com/postgresql-describe-table/


-1

/ dt là dấu phẩy liệt kê cho bạn tất cả các bảng có trong cơ sở dữ liệu. sử dụng
lệnh / d và / d + chúng ta có thể nhận được các chi tiết của bảng. Sysntax sẽ giống như
* / d tên_bảng (hoặc) \ d + tên_bảng


-3

Tôi đã tìm ra đoạn script sau để lấy lược đồ bảng.

'CREATE TABLE ' || 'yourschema.yourtable' || E'\n(\n' ||
array_to_string(
array_agg(
'    ' || column_expr
)
, E',\n'
) || E'\n);\n'
from
(
SELECT '    ' || column_name || ' ' || data_type || 
coalesce('(' || character_maximum_length || ')', '') || 
case when is_nullable = 'YES' then ' NULL' else ' NOT NULL' end as column_expr
FROM information_schema.columns
WHERE table_schema || '.' || table_name = 'yourschema.yourtable'
ORDER BY ordinal_position
) column_list;

||dường như là một cái gì đó giống như một toán tử nối (nối các chuỗi lại với nhau)
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.