Làm cách nào để lấy tên cột danh sách và kiểu dữ liệu của bảng trong PostgreSQL?


93

Với truy vấn sau, chúng ta có thể nhận được danh sách tên cột và kiểu dữ liệu của một bảng trong PostgreSQL.

Câu trả lời:


133

Mở psqldòng lệnh và nhập:

\d+ table_name

1
Tôi không hiểu tại sao đây không phải là câu trả lời được ủng hộ nhiều nhất.
mjezzi

19
Điều này chưa hoàn chỉnh vì OP có thể muốn thực hiện điều này theo chương trình trong mã SQL, không chỉ thông qua psql.
Luke

Postgres thực hiện nó theo chương trình, vì vậy chỉ cần bắt đầu postgres bằng cờ '-E': psql -Evà đối với mọi lệnh dấu gạch chéo ngược, SQL tương ứng sẽ được hiển thị trước kết quả của lệnh.
karatedog

118
select column_name,data_type 
from information_schema.columns 
where table_name = 'table_name';

với truy vấn trên, bạn có thể cột và kiểu dữ liệu của nó


4
Điều đó sẽ không đưa ra câu trả lời phù hợp cho các loại do người dùng xác định (ví dụ: cột Hình học và Địa lý do ogr2ogr tạo , có dạng geometry(Geometry,[SRID])).
GT.

1
Người ta cũng có thể sử dụng table_catalog = 'my_database'table_schema = 'my_schema'để chỉ lấy các cột từ một bảng cụ thể của một lược đồ cụ thể của một cơ sở dữ liệu cụ thể.
Marco Mannes

24
SELECT
        a.attname as "Column",
        pg_catalog.format_type(a.atttypid, a.atttypmod) as "Datatype"
    FROM
        pg_catalog.pg_attribute a
    WHERE
        a.attnum > 0
        AND NOT a.attisdropped
        AND a.attrelid = (
            SELECT c.oid
            FROM pg_catalog.pg_class c
                LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
            WHERE c.relname ~ '^(hello world)$'
                AND pg_catalog.pg_table_is_visible(c.oid)
        );

Thay đổi hello world bằng tên bảng của bạn

Thông tin thêm về nó: http://www.postgresql.org/docs/9.3/static/catalog-pg-attribute.html


2
Hoạt động, nhưng tại sao bạn lại sử dụng c.relname ~ '^(hello world)$thay vì đơn giản c.relname = 'hello world'?
Thomas

18

Đừng quên thêm tên lược đồ trong trường hợp bạn có nhiều lược đồ có cùng tên bảng.

SELECT column_name, data_type 
FROM information_schema.columns
WHERE table_name = 'your_table_name' AND table_schema = 'your_schema_name';

hoặc sử dụng psql:

\d+ your_schema_name.your_table_name

7

Câu trả lời Pratik được cập nhật để hỗ trợ nhiều lược đồ và giá trị nullable:

SELECT
    "pg_attribute".attname                                                    as "Column",
    pg_catalog.format_type("pg_attribute".atttypid, "pg_attribute".atttypmod) as "Datatype",

    not("pg_attribute".attnotnull) AS "Nullable"
FROM
    pg_catalog.pg_attribute "pg_attribute"
WHERE
    "pg_attribute".attnum > 0
    AND NOT "pg_attribute".attisdropped
    AND "pg_attribute".attrelid = (
        SELECT "pg_class".oid
        FROM pg_catalog.pg_class "pg_class"
            LEFT JOIN pg_catalog.pg_namespace "pg_namespace" ON "pg_namespace".oid = "pg_class".relnamespace
        WHERE
            "pg_namespace".nspname = 'schema'
            AND "pg_class".relname = 'table'
    );

7

Một phiên bản hỗ trợ tìm tên cột và kiểu của bảng trong một lược đồ cụ thể và sử dụng JOIN mà không cần bất kỳ truy vấn con nào

SELECT
    pg_attribute.attname AS column_name,
    pg_catalog.format_type(pg_attribute.atttypid, pg_attribute.atttypmod) AS data_type
FROM
    pg_catalog.pg_attribute
INNER JOIN
    pg_catalog.pg_class ON pg_class.oid = pg_attribute.attrelid
INNER JOIN
    pg_catalog.pg_namespace ON pg_namespace.oid = pg_class.relnamespace
WHERE
    pg_attribute.attnum > 0
    AND NOT pg_attribute.attisdropped
    AND pg_namespace.nspname = 'my_schema'
    AND pg_class.relname = 'my_table'
ORDER BY
    attnum ASC;

2
    SELECT DISTINCT
        ROW_NUMBER () OVER (ORDER BY pgc.relname , a.attnum) as rowid , 
        pgc.relname as table_name ,
        a.attnum as attr,
        a.attname as name,
        format_type(a.atttypid, a.atttypmod) as typ,
        a.attnotnull as notnull, 
        com.description as comment,
        coalesce(i.indisprimary,false) as primary_key,
        def.adsrc as default
    FROM pg_attribute a 
    JOIN pg_class pgc ON pgc.oid = a.attrelid
    LEFT JOIN pg_index i ON 
        (pgc.oid = i.indrelid AND i.indkey[0] = a.attnum)
    LEFT JOIN pg_description com on 
        (pgc.oid = com.objoid AND a.attnum = com.objsubid)
    LEFT JOIN pg_attrdef def ON 
        (a.attrelid = def.adrelid AND a.attnum = def.adnum)
    LEFT JOIN pg_catalog.pg_namespace n ON n.oid = pgc.relnamespace

    WHERE 1=1 
        AND pgc.relkind IN ('r','')
        AND n.nspname <> 'pg_catalog'
        AND n.nspname <> 'information_schema'
        AND n.nspname !~ '^pg_toast'

    AND a.attnum > 0 AND pgc.oid = a.attrelid
    AND pg_table_is_visible(pgc.oid)
    AND NOT a.attisdropped
    ORDER BY rowid
    ;

2

Để làm cho chủ đề này 'hoàn thiện hơn'.

Tôi yêu cầu tên cột và kiểu dữ liệu trên câu lệnh SELECT (không phải bảng).

Nếu bạn muốn thực hiện việc này trên một câu lệnh SELECT thay vì một bảng hiện có thực, bạn có thể làm như sau:

DROP TABLE IF EXISTS abc;
CREATE TEMPORARY TABLE abc AS
-- your select statement here!
SELECT 
    *
FROM foo
-- end your select statement
;

select column_name, data_type 
from information_schema.columns 
where table_name = 'abc';
DROP IF EXISTS abc;

Giải thích ngắn gọn, nó tạo ra một bảng (tạm thời) cho câu lệnh lựa chọn của bạn, mà bạn có thể 'gọi' thông qua truy vấn được cung cấp bởi (trong số những người khác) @a_horse_with_no_name và @selva.

Hi vọng điêu nay co ich.


2

mà không cần đề cập đến lược đồ, bạn cũng có thể nhận được các chi tiết cần thiết Hãy thử truy vấn này->

chọn tên_bảng, kiểu_dữ liệu từ information_schema.columns nơi table_name = 'table_name';


0

Để nhận thông tin về cột của bảng, bạn có thể sử dụng:

\dt+ [tablename]

Để nhận thông tin về kiểu dữ liệu trong bảng, bạn có thể sử dụng:

\dT+ [datatype]

1
\ dt + tablename get thông tin về bảng, nhưng không có cột
Zhihong

0

chọn column_name, data_type từ information_schema.columns trong đó table_name = 'your_table_name' và table_catalog = 'your_database_name' và table_schema = 'your_schema_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.