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)?
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)?
Câu trả lời:
+
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
psql -E
rấ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)
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.
\d+
không. Đây là câu trả lời hay nhất IMO
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.
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.columns
sẽ chỉ báo cáo loại cơ sở của numeric
.
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
Tương đương với psql DESCRIBE TABLE
là \d table
.
Xem phần psql của hướng dẫn PostgreSQL để biết thêm chi tiết.
\c databasename
chứ 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 tablename
tạo ra No relations found.
thông điệp và không có gì hơn.
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.
\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
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'
FROM info_schema.columns
Tô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.
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.
Biến thể của truy vấn này (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/
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
Để 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
;
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.
* Sử dụng PG admin3
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
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 |
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
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/
/ 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
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;