Как выполнить эквивалент Oracle DESCRIBE TABLE
в PostgreSQL (с помощью команды psql)?
PostgreSQL «ОПИСАТЬ ТАБЛИЦУ»
Ответы (23)
Попробуйте это (в программе командной строки psql
):
\d+ tablename
См. руководство для получения дополнительной информации.
Я добавлю команду pg_dump, даже если запрошена команда psql. потому что он генерирует вывод, более общий для предыдущих пользователей MySQl.
# sudo -u postgres pg_dump --table=my_table_name --schema-only mydb
Если ваша таблица не является частью схемы по умолчанию, вы должны написать:
\d+ schema_name.table_name
В противном случае вы получите сообщение об ошибке «Связь не существует».
Существует множество способов описания таблицы в PostgreSQL
Простой ответ:
> /d <table_name> -- OR
> /d+ <table_name>
Использование
Если вы работаете в оболочке Postgres [
psql
] и вам нужно описать таблицы
Вы также можете добиться этого с помощью запроса [Поскольку многие друзья опубликовали правильные способы]
Многие детали схемы доступны в именах таблиц Postgres по умолчанию information_schema
.
Вы можете напрямую использовать его для получения информации о любой таблице с помощью простого оператора SQL.
Простой запрос
SELECT
*
FROM
information_schema.columns
WHERE
table_schema = 'your_schema' AND
table_name = 'your_table';
Средний запрос
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
Вам просто нужно заменить tablename
.
Жесткий запрос
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 = 'schema' -- Replace with Schema name
AND c.relname = 'tablename' -- Replace with table name
AND f.attnum > 0 ORDER BY number;
Вы можете выбрать любой из вышеперечисленных способов описания таблицы.
Любой из вас может отредактировать эти ответы, чтобы улучшить способы. Я открыт для объединения ваших изменений. :)
1) PostgreSQL ОПИСАНИЕ ТАБЛИЦЫ с использованием psql
В инструменте командной строки psql \ d table_name или \ d + table_name , чтобы найти информацию о столбцах таблицы
2) PostgreSQL ОПИСАНИЕ ТАБЛИЦЫ с использованием information_schema
Оператор SELECT для запроса имен столбцов, типа данных, максимальной длины символа таблицы столбцов в базе данных information_schema;
ВЫБРАТЬ COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH из INFORMATION_SCHEMA.COLUMNS, где table_name = 'tablename';
Для получения дополнительной информации https://www.postgresqltutorial.com/postgresql-describe-table/
Это должно быть решением:
SELECT * FROM information_schema.columns
WHERE table_schema = 'your_schema'
AND table_name = 'your_table'
Чтобы улучшить SQL-запрос другого ответа (что здорово!), Вот исправленный запрос. Он также включает имена ограничений, информацию о наследовании и типы данных, разбитые на составные части (тип, длина, точность, масштаб). Он также отфильтровывает столбцы, которые были отброшены (которые все еще существуют в базе данных).
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
;
В postgres \ d используется для описания структуры таблицы.
например \d schema_name.table_name
эта команда предоставит вам основную информацию о таблице, такую как столбцы, тип и модификаторы.
Если вам нужна дополнительная информация о таблице, используйте
\d+ schema_name.table_name
это даст вам дополнительную информацию, такую как хранилище, цель статистики и описание
В MySQL ОПИСАТЬ имя_таблицы
В PostgreSQL , \ d имя_таблицы
Или вы можете использовать эту длинную команду:
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
Я разработал следующий сценарий для получения схемы таблицы.
'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;
||
похоже на оператор конкатенации (соединение строк)
Этот вариант запроса (как описано в других ответах) сработал для меня.
SELECT
COLUMN_NAME
FROM
information_schema.COLUMNS
WHERE
TABLE_NAME = 'city';
Подробно это описано здесь: http://www.postgresqltutorial.com/postgresql-describe-table/
/ dt - это команда, которая выводит список всех таблиц, имеющихся в базе данных. используя
/ d команда и / d + мы можем получить подробную информацию о таблице. Sysntax будет иметь вид
* / d имя_таблицы (или) \ d + имя_таблицы
Лучший способ описать таблицу, например, столбец, тип, модификаторы столбцов и т. Д.
\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 |
Вы также можете проверить, используя запрос ниже
Select * from schema_name.table_name limit 0;
Expmple: Моя таблица имеет имя 2 столбца и pwd. Ниже даю скриншот.
* Использование PG admin3
потому что выбор и ожидание того, что pgadmin возьмет на себя отставание в получении метаданных, не является "лучшей практикой"
Предложение LIMIT
оценивается после как FROM
, так и SELECT
; следовательно, для завершения этого запроса потребуется длинное время, если рассматриваемая таблица большая.
Используйте следующий оператор SQL
SELECT DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'tbl_name'
AND COLUMN_NAME = 'col_name'
Если вы замените tbl_name и col_name, отобразится тип данных конкретного столбца, который вы ищете.
Вот что говорит этот ответ от 2008 года.
@ Quentin-Есть разница в них обоих .. Вышеупомянутое решение 2008 года описывает имя_столбца, тип_данных, максимальную_длину_символа для всей таблицы. Где, как мое - упомянутое решение - показывает только тип данных столбца схемы. Запускаем оба и проверяем. Они оба разные. Все решения здесь - это разные способы решения проблемы. Пользователь может использовать это по разным причинам
В дополнение к уже найденной командной строке \d+ <table_name>
вы также можете использовать информационную схему для поиска данных столбца, используя info_schema.columns <8784616084675160> <8784616084675160>
SELECT *
FROM info_schema.columns
WHERE table_schema = 'your_schema'
AND table_name = 'your_table'
FROM info_schema.columns
у меня не сработало, мне пришлось использовать from information_schema.columns
, не уверен, что это опечатка в вашем ответе или какая-то проблема с реализацией с моей стороны.
Вы можете использовать это:
SELECT attname
FROM pg_attribute,pg_class
WHERE attrelid=pg_class.oid
AND relname='TableName'
AND attstattarget <>0;
Вы можете выполнить \d *search pattern *
со звездочками , чтобы найти таблицы, которые соответствуют интересующему вас шаблону поиска.
Это было то, что я искал - как описать подмножество таблиц. Следует отметить, что я также обнаружил, что если в ваших таблицах прописные буквы, синтаксис будет \d *"<SubString>"*
. То есть двойные кавычки должны быть внутри звездочек. Хотя, если вам просто нужен список таблиц, тогда вы хотите использовать \dt
это соответствует последовательностям и индексам, а также таблицам
Если вы хотите получить его из запроса, а не из psql, вы можете запросить схему каталога. Вот такой сложный запрос:
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
;
Это довольно сложно, но оно действительно показывает вам мощь и гибкость системного каталога PostgreSQL и должно помочь вам освоить pg_catalog ;-). Обязательно замените% s в запросе. Первый - это схема, а второй - имя таблицы.
Этот запрос лучше показан здесь обратите внимание, что они также предлагают "\ d table"
Одним из преимуществ этого решения является то, что format_type()
будет включать любые модификаторы, прикрепленные к типу, например numeric(6,2)
; тогда как information_schema.columns
будет сообщать только базовый тип numeric
.
Как отделить тип данных от размера? сказать | различный характер (50) | в 2 столбца: | характер меняющийся | 50 |
В дополнение к способу PostgreSQL (\ d 'что-то' или \ dt 'таблица' или \ ds 'последовательность' и т. Д.)
Стандартный способ SQL, как показано здесь:
select column_name, data_type, character_maximum_length, column_default, is_nullable
from INFORMATION_SCHEMA.COLUMNS where table_name = '<name of table>';
Поддерживается многими механизмами баз данных.
выберите имя_столбца, тип_данных, максимальная длина_символа из INFORMATION_SCHEMA.COLUMNS, где имя_таблицы = 'таблица';
Это более полезно, чем \ d, когда вы застряли с psql до 8.4 и с сервером после 8.4 - команда \ d несовместима.
Также эта команда работает с RedShift, а \d+
- нет. Это лучший ответ IMO
Замечательно, хотя для postgres я бы тоже добавил имя схемы
\ d, \ d + не работают с Navicat. Этот небольшой запрос достаточно хорош! Это должен был быть ответ!
Я бы добавил ORDER BY ordinal_position
, чтобы было еще лучше.
обновление до @NewAlexandria: \ d + теперь работает в красном смещении
Здесь перечислены только столбцы с минимальным количеством информации. \ d + дает полный DDL для таблицы, включая: значения по умолчанию, допустимость значений NULL, следующее значение, точность, первичный ключ, внешние ключи, индексы, ограничения проверки и FK из других таблиц.
@ bradw2k Вы пробовали SELECT *?
@Dan Таблица столбцов не содержит информации о таких вещах, как первичный ключ, внешние ключи, индексы, ограничения проверки. В одном проекте я оставил соединение от «columns» к «key_column_usage» и «table_constraints», чтобы подобрать ограничения PK и FK. Вся информация точно содержится в этой схеме.
На самом деле это наиболее точный ответ, так как Oracle DESCRIBE перечислит только информацию о столбцах, как и эта команда. Все остальные вещи, о которых сообщает \ d (индексы, ограничения), не являются частью простого DESCRIBE, и часто я не хочу их видеть - жаль, что нет команды \ d-, чтобы сделать psql немного менее подробным ...
Вы можете сделать это с помощью команды psql с косой чертой:
\d myTable describe table
Также работает для других объектов:
\d myView describe view
\d myIndex describe index
\d mySequence describe sequence
Источник: faqs.org
Эквивалент DESCRIBE TABLE
в psql: \d table
.
Подробнее см. В разделе psql руководства PostgreSQL.
Кроме того, выбор базы данных psql - \c databasename
, а не use databasename
(для тех, кто работает с MySQL, как я :-). Без \c databasename
сначала \d tablename
создает сообщение No relations found.
и ничего более.
Изначально я принял ответ Девинмура, но этот мне действительно нравится больше. Он не только описывает таблицу, но также показывает метаданные, такие как описания столбцов и наличие каких-либо OID.
+
действительно сцепление, поскольку PostgresSQL 9 дает подробное описание представлений только тогда, когда вы выполняете\d+ table_name
, а не просто\d table_name
\ d не работает, когда вы вызываете его в PostgreSQL 9.1 через pgAdmin, ответ Vinkos ниже применим к большему количеству случаев
psql -E
удобен для получения sql, который реализует\d+
и аналогичные (для использования вне приглашения psql)Примечание. Это работает только из клиента командной строки
psql
. Под капотом он выдает запрос для получения информации с сервера, как показано в ответе ниже.Ошибка: «не найдено ни одного указанного отношения». Это означает, что вам нужно заключить имя вашей таблицы в двойные кавычки. По-видимому, postgres будет строчными буквами имя вашей таблицы без них и, следовательно, не найдет вашу таблицу. Надеюсь, это поможет всем, кто приходит сюда и сталкивается с этой проблемой. :)
Кто бы ни придумал интерфейс CLI, который создает однобуквенные команды, начинающиеся с той же буквы, что и d rop или d elete, не должен разрабатывать базы данных.
Это сложно запомнить, продолжайте путать \ dt (список таблиц в базе данных) с \ d + tablename (описывать таблицу).
Я всегда приезжаю сюда и никогда не запоминаю синтаксис: OF ... в этом месяце уже третий раз: D