Car*_*les 15 sql postgresql attributes database-design
我有一个项目,我需要一个查询来获取列的所有属性(列名称,位置,数据类型,非空?和注释)所有这些使用表名称.
我实现了获取列名,位置数据类型和非空?使用此查询:
SELECT column_name, data_type, ordinal_position, is_nullable
FROM information_schema."columns"
WHERE "table_name"='TABLE-NAME'
Run Code Online (Sandbox Code Playgroud)
但是,我需要评论!
Chr*_*loe 26
这是针对系统目录的查询,该目录应该获取您需要的所有内容(免费提供奖励主键字段).
SELECT DISTINCT
a.attnum as num,
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)
WHERE a.attnum > 0 AND pgc.oid = a.attrelid
AND pg_table_is_visible(pgc.oid)
AND NOT a.attisdropped
AND pgc.relname = 'TABLE_NAME' -- Your table name here
ORDER BY a.attnum;
Run Code Online (Sandbox Code Playgroud)
哪个会返回如下结果:
num | name | typ | notnull | comment | primary_key
-----+-------------+-----------------------------+---------+---------------------+-------------
1 | id | integer | t | a primary key thing | t
2 | ref | text | f | | f
3 | created | timestamp without time zone | t | | f
4 | modified | timestamp without time zone | t | | f
5 | name | text | t | | f
Run Code Online (Sandbox Code Playgroud)
NOT NULLCOMMENT为列定义的任何内容PRIMARY KEYSELECT a.attnum
,a.attname AS name
,format_type(a.atttypid, a.atttypmod) AS typ
,a.attnotnull AS notnull
,coalesce(p.indisprimary, FALSE) AS primary_key
,f.adsrc AS default_val
,d.description AS col_comment
FROM pg_attribute a
LEFT JOIN pg_index p ON p.indrelid = a.attrelid AND a.attnum = ANY(p.indkey)
LEFT JOIN pg_description d ON d.objoid = a.attrelid AND d.objsubid = a.attnum
LEFT JOIN pg_attrdef f ON f.adrelid = a.attrelid AND f.adnum = a.attnum
WHERE a.attnum > 0
AND NOT a.attisdropped
AND a.attrelid = 'schema.tbl'::regclass -- table may be schema-qualified
ORDER BY a.attnum;
Run Code Online (Sandbox Code Playgroud)
但:
表名在数据库中不是唯一的,因此也不在系统目录中.您可能必须对该名称进行架构限定.
使用a.attrelid = 'tbl'::regclass的条件.这样您就可以传递myschema.mytbl名称和消除歧义.pg_class在这种情况下,根本不需要加入.
此外,自动检查可见性,regclass并且不需要pg_table_is_visible().
甲主键可以跨越多个列.我通过加入来pg_index解决这个问题a.attnum = ANY(p.indkey).
indkey属于类型int2vecor,这是一种特殊情况int2[],仅用于目录中.
我觉得psql -E这类问题很有帮助.
在主要版本更新后,这样的专用查询可能会中断.Postgres不保证目录表保持稳定.基本元素变化的可能性极小,但查询越复杂和专业化,机会就越大.您可以使用信息模式,这是标准化的,但也相对较慢.