PostgreSQL " таблица описания"
Как вы выполняете эквивалент Oracle DESCRIBE TABLE
в PostgreSQL (с помощью команды psql)?
18 ответов:
попробуйте это (в
psql
инструмент командной строки):\d+ tablename
посмотреть руководство для получения дополнительной информации.
в дополнение к способу PostgreSQL (\d' что-то 'или \dt' таблица 'или \DS' последовательность ' и так далее)
стандартный способ SQL, как показано здесь:
select column_name, data_type, character_maximum_length from INFORMATION_SCHEMA.COLUMNS where table_name = '<name of table>';
он поддерживается многими СУБД.
Если вы хотите получить его из запроса вместо 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 в запрос. Первый-это схема, а второй-имя таблицы.
Вы можете сделать это с помощью команды psql Слэш:
\d myTable describe table
Это также работает для других объектов:
\d myView describe view \d myIndex describe index \d mySequence describe sequence
Источник:faqs.org
эквивалент psql
DESCRIBE TABLE
и\d table
.дополнительную информацию см. В разделе psql руководства PostgreSQL.
можно сделать
\d *search pattern *
звездочки чтобы найти таблицы, соответствующие шаблону поиска, который вас интересует.
В дополнение к командной строке
\d+ <table_name>
вы уже нашли, вы также можете использовать информация-схемы чтобы посмотреть данные столбца, используя info_schema.колонкиSELECT * FROM info_schema.columns WHERE table_schema = 'your_schema' AND table_name = 'your_table'
вы можете использовать это :
SELECT attname FROM pg_attribute,pg_class WHERE attrelid=pg_class.oid AND relname='TableName' AND attstattarget <>0;
используйте следующую инструкцию SQL
SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'tbl_name' AND COLUMN_NAME = 'col_name'
Если вы замените tbl_name и col_name, он отображает тип данных конкретного coloumn, который вы ищете.
этот вариант запроса (как описано в других ответах) работал для меня.
SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_NAME = 'city';
это описано здесь в деталях: http://www.postgresqltutorial.com/postgresql-describe-table/
лучший способ описать таблицу, такую как столбец, тип, модификаторы столбцов и т. д.
\d+ tablename or \d tablename
In MySQL , описание имя_таблицы
In PostgreSQL, \d table_name
или , вы можете использовать эту длинную команду:
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
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 |
/DT-это запятая, которая перечисляет вам все таблицы, присутствующие в базе данных. используя
команда /d и /d+ мы можем получить подробную информацию о таблице. В sysntax будет как
* /d table_name (or) \d+ table_name
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
чтобы улучшить 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 ;
Я разработал следующий сценарий, чтобы получить схему таблицы.
'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;