DESCRIBE TABLE
(psqlコマンドを使用して)PostgreSQLでOracleと同等の機能をどのように実行しますか?
22 に答える
PostgreSQLの方法に加えて(\ d'something'または\dt'table'または\ds'sequence'など)
ここに示すように、SQLの標準的な方法:
select column_name, data_type, character_maximum_length, column_default, is_nullable
from INFORMATION_SCHEMA.COLUMNS where table_name = '<name of table>';
多くのdbエンジンでサポートされています。
psql ではなく query から取得する場合は、カタログ スキーマにクエリを実行できます。これを行う複雑なクエリを次に示します。
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 を必ず変更してください。1 つ目はスキーマで、2 つ目はテーブル名です。
これは、psqlslashコマンドを使用して実行できます。
\d myTable describe table
他のオブジェクトでも機能します。
\d myView describe view
\d myIndex describe index
\d mySequence describe sequence
出典:faqs.org
に相当するpsqlDESCRIBE TABLE
はです\d table
。
詳細については、PostgreSQLマニュアルのpsqlの部分を参照してください。
\d *search pattern *
アスタリスクを使用して、関心のある検索パターンに一致するテーブルを見つけることができます。
\d+ <table_name>
既に見つけたコマンド ラインに加えて、info_schema.columnsを使用して、情報スキーマを使用して列データを検索することもできます。
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;
テーブルスキーマを取得するために、次のスクリプトを作成しました。
'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;